λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT자격증 곡뢀/SQLD μ˜ˆμƒλ³΅μ›

[SQLD] 2023λ…„ SQLD 49회 κΈ°μΆœλ³΅μ› ( 1κ³Όλͺ©/2κ³Όλͺ© )

by yunamom 2023. 6. 10.
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš” yunamom μž…λ‹ˆλ‹€ :D

2023λ…„ 6μ›” 10일에 μΉ˜λ€„μ§„ 제49회 SQLD μ‹œν—˜ 1κ³Όλͺ©, 2κ³Όλͺ© 정닡을 ν¬μŠ€νŒ… ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ‘©πŸ»‍πŸ’»

 

*문제 μˆœμ„œλŠ” λ‹€λ₯Ό 수 있으며 λ‹΅ 자체λ₯Ό μ μ–΄λ‘κ±°λ‚˜ 문제만 적은 κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.


SQLD 49회 1κ³Όλͺ© ( 객관식 9문제 / λ‹¨λ‹΅ν˜• 1문제 )

 

β–  문제 1. μ•„λž˜μ˜ μ •κ·œν™” 결과에 μ•Œλ§žμ€ μ •κ·œν™”λŠ”?

μ •λ‹΅: 2μ°¨ μ •κ·œν™” 

ν•΄μ„€: μ‹λ³„μž μ»¬λŸΌκ°„μ˜ 쒅속성 ν•΄κ²°


β–  문제 2. 속성이 κ°€μ§ˆ 수 μžˆλŠ” 데이터 κ°’μ˜ λ²”μœ„λ₯Ό 무엇이라 ν•˜λŠ”κ°€?

μ •λ‹΅: λ„메인


β–  문제 3. μ£Όμ‹λ³„μžλ₯Ό κ΅¬μ„±ν•˜λŠ” μ†μ„±μ—μ„œ ν•˜λ‚˜λ§Œμ΄λΌλ„ 제거되면 μœ μΌμ„±μ„ λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” νŠΉμ„±μ€ 무엇인가?

μ •λ‹΅: μ΅œμ†Œμ„±


β–  문제 4. λ‹€μŒ 보기 쀑 μ•„λž˜ ERD에 λŒ€ν•œ μ„€λͺ…μœΌλ‘œ λ°”λ₯΄μ§€ μ•Šμ€ 것은?

μ •λ‹΅: 3번 ν•˜λ‚˜μ˜ μƒν’ˆμ€ 항상 주문을 가진닀

ν•΄μ„€: ν•˜λ‚˜μ˜ μƒν’ˆμ€ 주문을 κ°€μ§ˆμˆ˜λ„ or 가지지 μ•Šμ„μˆ˜λ„ μžˆλ‹€. ( O = or )

#πŸ’‘μ•Œμ•„λ‘κΈ°
ERD μ‹€μ„ (Identifying) / 점선(Non-Identifying) 의 차이

1. μ‹€μ„  ( 식별관계 )
- λΆ€λͺ¨ν…Œμ΄λΈ”μ˜ PKκ°€ μ™Έλž˜ν‚€λ‘œμ¨, μžμ‹ν…Œμ΄λΈ”μ˜ PK에 포함이 λ˜λŠ” 경우
- λΆ€λͺ¨, μžμ‹ 관계 

2. 점선 ( 비식별관계 )
- λΆ€λͺ¨ν…Œμ΄λΈ”μ˜ PKκ°€ μ™Έλž˜ν‚€λ‘œμ¨, μžμ‹ν…Œμ΄λΈ”μ˜ PKκ°€ μ•„λ‹Œ *μΌλ°˜μ†μ„±* 이 λ˜λŠ” 경우
- λΆ€λͺ¨, μžμ‹ 관계가 μ•„λ‹Œ λͺ¨λ“  경우λ₯Ό ν‘œμ‹œν•¨

두 μ—”ν„°ν‹°κ°„ κ΄€κ³„μ—μ„œ μˆ˜ν–‰λ˜λŠ” 경우의 수 (κ΄€κ³„μ°¨μˆ˜)


β–  문제 5. λ„λ©”μΈμ˜ νŠΉμ§•μ΄ μ•„λ‹Œ 것 ?

μ •λ‹΅: FK μ œμ•½ 쑰건


β–  문제 6. μ‹λ³„μž 관계 ν‹€λ¦° 선지 κ³ λ₯΄λŠ” 문제

μ •λ‹΅: 4번. μ‹λ³„μžκ΄€κ³„λŠ” μžμ‹μ˜ μ£Όμ‹λ³„μžκ°€ λΆ€λͺ¨λ‘œλΆ€ν„° λ…λ¦½λ˜μ–΄μžˆκ³ , λΉ„μ‹λ³„μž κ΄€κ³„λŠ” μžμ‹μ˜ μ£Όμ‹λ³„μžκ°€ λΆ€λͺ¨μ—κ²Œ μ’…μ†λ˜μ–΄μžˆλ‹€.


β–  문제 7. 보기에 ν•΄λ‹Ήν•˜λŠ” 속성을 κ³ λ₯΄μ‹œμ˜€.

업무상 ν•„μš”ν•œ 데이터 이외에 데이터 λͺ¨λΈλ§μ„ μœ„ν•΄ 업무λ₯Ό κ·œμΉ™ν™”ν•˜κΈ° μœ„ν•œ 속성을 μƒˆλ‘œ λ§Œλ“€κ±°λ‚˜
λ³€ν˜•ν•˜μ—¬ μ •μ˜ν•˜λŠ” 속성은 무엇인가?

μ •λ‹΅: μ„€κ³„ 속성


β–  문제 8. μ•„λž˜μ˜ μ„€λͺ…μœΌλ‘œ μ•Œλ§žμ€ 것은?

두 개 μ΄μƒμ˜ λΆ€λͺ¨ μ—”ν„°ν‹°λ‘œ λΆ€ν„° λ°œμƒλ˜κ³  자주 λ‚΄μš©μ΄ λ°”λ€Œκ±°λ‚˜ λ°μ΄ν„°λŸ‰μ΄ μ¦κ°€λœλ‹€.
λΆ„μ„μ΄ˆκΈ° λ‹¨κ³„μ—μ„œλŠ” 잘 λ‚˜νƒ€λ‚˜μ§€ μ•ŠμœΌλ©° 상세 섀계 λ‹¨κ³„λ‚˜ ν”„λ‘œμ„ΈμŠ€μ™€ 상관λͺ¨λΈλ§μ„ μ§„ν–‰ν•˜λ©΄μ„œ λ„μΆœλ  수 μžˆλ‹€.

μ •λ‹΅: ν–‰μœ„ μ—”ν„°ν‹°


β–  문제 9. μ•„λž˜μ˜ μ‹λ³„μž λΆ„λ₯˜μ— λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ μ ˆν•œ 것은?

μ •λ‹΅: μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ


β–  λ‹¨λ‹΅ν˜• 1. 두 개의 μ—”ν„°ν‹°κ°„ κ΄€κ³„μ—μ„œ μ°Έμ—¬μžμ˜ 수λ₯Ό ν‘œν˜„ν•˜λŠ” 것을 무엇이라 ν•˜λŠ”κ°€?

μ •λ‹΅: κ΄€κ³„μ°¨μˆ˜ ( Cardinality )

 

SQLD 49회 2κ³Όλͺ© ( 객관식 35문제 / λ‹¨λ‹΅ν˜• 5문제 )

 

β–  문제 10. PLAYER ν…Œμ΄λΈ”μ—μ„œ μ„ μˆ˜λͺ…κ³Ό νŒ€λͺ…은 μ˜€λ¦„μ°¨μˆœ, 연봉은 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ‘°νšŒν•˜λŠ” SQL 둜 λ°”λ₯Έκ²ƒμ€? (2번)

1) SELECT μ„ μˆ˜λͺ…, νŒ€λͺ…, 연봉 FROM ORDER BY μ„ μˆ˜λͺ… DESC, νŒ€λͺ… DESC, 연봉 ASC

2) SELECT μ„ μˆ˜λͺ…, νŒ€λͺ…, 연봉 FROM ORDER BY μ„ μˆ˜λͺ… ASC, νŒ€λͺ…, 3 DESC

3) SELECT μ„ μˆ˜λͺ…, νŒ€λͺ…, 연봉 FROM ORDER BY μ„ μˆ˜λͺ… ASC, νŒ€λͺ… ASC, 연봉

4) SELECT μ„ μˆ˜λͺ…, νŒ€λͺ…, 연봉 FROM ORDER BY μ„ μˆ˜λͺ…, νŒ€λͺ…, DESC 연봉

ν•΄μ„€: μ„ μˆ˜λͺ… ASC(μ˜€λ¦„μ°¨μˆœ),νŒ€λͺ…(default μ˜€λ¦„μ°¨μˆœ), 3 DESC(3번째 μ—΄ λ‚΄λ¦Όμ°¨μˆœ)


β–  λ¬Έμ œ 11. SQL 의 λΆ„λ₯˜λ‘œ μ μ ˆν•˜μ§€ μ•Šμ€ 것은?

μ •λ‹΅: DML = RENAME


β–  λ¬Έμ œ 12. COMMIT을 ν•˜κΈ° μ „ DML에 λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ μ ˆν•˜μ§€ μ•Šμ€ 것은?

μ •λ‹΅: λ‹€λ₯Έ μœ μ €κ°€ 데이터λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.


β–  λ¬Έμ œ 13. μ•„λž˜μ˜ ν…Œμ΄λΈ”μ—μ„œ 순방ν–₯으둜 κ³„μΈ΅ν˜• 쿼리λ₯Ό ꡬ성할 λ•Œ μ˜¬λ°”λ₯Έ 것은?

μ •λ‹΅: CONNECT BY PRIOR EMP_NO = MAAGER_NO

ν•΄μ„€: PRIOR μžμ‹ = λΆ€λͺ¨ ν˜•νƒœλ₯Ό μ‚¬μš©ν•˜λ©΄ 계측 ꡬ쑰의 λΆ€λͺ¨ λ°μ΄ν„°μ—μ„œ μžμ‹ 데이터(λΆ€λͺ¨ -> μžμ‹) λ°©ν–₯으둜 μ „κ°œν•˜λŠ” 순방ν–₯ μ „κ°œλ₯Ό 함.

# πŸ’‘μ•Œμ•„λ‘κΈ°
CONNECT BY PRIOR μžμ‹ = λΆ€λͺ¨ (λΆ€λͺ¨ → μžμ‹) (순 ↓ λ°©ν–₯)
CONNECT BY PRIOR λΆ€λͺ¨ = μžμ‹ (μžμ‹ → λΆ€λͺ¨) (μ—­ ↑ λ°©ν–₯)

CONNECT BY μžμ‹ = PRIOR λΆ€λͺ¨ (μžμ‹ → λΆ€λͺ¨) (μ—­ ↑ λ°©ν–₯)
CONNECT BY λΆ€λͺ¨ = PRIOR μžμ‹ (λΆ€λͺ¨ → μžμ‹) (순 ↓ λ°©ν–₯)

β–  λ¬Έμ œ 14. ORACLE DBMS μ—μ„œ μ•„λž˜μ˜ NULL 처리 ν•¨μˆ˜μ— λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ˜¬λ°”λ₯Έ 것은?

[보기]
A : μ»¬λŸΌκ°’μ΄ NULL이면 Bλ₯Ό 좜λ ₯
B : λ‘κ°œμ˜ 컬럼 값이 κ°™μœΌλ©΄ NULL
C : NULL이 λ‚˜μ˜¬ λ•Œ κΉŒμ§€

μ •λ‹΅: NVL / NULLIF / COALESCE


β–  문제 15. λ‹€μŒ 쀑 μ•„λž˜ SQL의 μ‹€ν–‰κ²°κ³Όλ‘œ κ°€μž₯ μ μ ˆν•œ 것은? (λ…Έλž­μ΄ 2κ³Όλͺ© 55번)

[TBL]
ID
---
100
100
200
200
200
999
999


[SQL]
SELECT ID FROM TBL
GROUP BY ID
HAVING COUNT(*) = 2
ORDER BY (CASE WHEN ID = 999 THEN 0 ELSE ID END)
1)       2)
ID       ID
---      ---
100      999
999      100

3)       4)
ID       ID
---      ---
100      999
200      200
999      100

μ •λ‹΅: 2번 999, 100 μˆœμ„œλ‘œ λ‚˜μ˜€λŠ” SQL κ²°κ³Ό

(CASE WHEN ID = 999 THEN 0 ELS ID END) μ •λ‹΅ 999(μ²«λ²ˆμ§Έν–‰), 100(λ‘λ²ˆμ§Έν–‰)


β–  문제 16. μ•„λž˜μ˜ ν…Œμ΄λΈ”μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” SQL을 κ³ λ₯΄μ‹œμ˜€.

[TEAM]

ID   COL1
---------
1     A
2     B
3     C
4     D

[STADIUM]

ID   COL2
----------
1     A
2     B
1) SELECT * FROM TEAM A INNER JOIN STADIUM B ON A.ID = B.ID

2) SELECT * FROM TEAM A INNER JOIN STADIUM B USING(ID)

3) SELECT * FROM TEAM A NATURAL JOIN STADIUM B

4) SELECT * FROM TEAM A INNER JOIN STADIUM B ON (ID)

μ •λ‹΅: 4번 SELECT ... FROM A INNER JOIN B ON (STUDENT_ID)

ν•΄μ„€: Error : ORA-00920: invalid relational operator

ONμ ˆμ€ λ‘κ°œμ˜ 컬럼쑰건이 μ‚¬μš©λ˜μ–΄μ•Ό 함.


β–  문제 17. μ•„λž˜μ˜ ν…Œμ΄λΈ”μ—μ„œ 사원이 λ§€λ‹ˆμ € 연봉이 3000 μ΄ν•˜μΈ κ²°κ³Όλ₯Ό μ°ΎλŠ” SQL이 μ•„λ‹Œ 것은?

μ •λ‹΅: NOT EXISTS (SELECT 'X' FROM ... WHERE A.MGR_NO = B.EMP_NO WHERE ... > 3000)

ν•΄μ„€:  NULL이 ν¬ν•¨λœ 경우 NULL이 좜λ ₯λ˜λŠ” 쑰건절 NOT EXISTSλ₯Ό κ΅¬λΆ„ν•˜λŠ” 문제


β–  문제 18. μ•„λž˜μ˜ SQL 에 λŒ€ν•œ 결과둜 μ˜¬λ°”λ₯Έκ²ƒμ„ κ³ λ₯΄μ‹œμ˜€.

[SQL]

SELECT ...
FROM ...
WHERE (A, B) IN (SELECT A, B FROM ...)

μ •λ‹΅: B의 값쀑 ν•˜λ‚˜κ°€ NULL 인 κ²°κ³Ό

ν•΄μ„€: NOT IN 의 경우 NULL 이 μžˆμ„ λ•Œ 0 ROWS 둜 처리됨


β–  문제 19. μ•„λž˜μ˜ SQLκ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” SQL을 μ™„μ„±ν•˜μ‹œμ˜€. ( 집계 κ΄€λ ¨ 문제 )

 

- ROLLUPκ³Ό 같은 κ΅¬μ‘°μ΄λ‚˜ μ‹€μ œ 전체 합이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν˜•νƒœ
- GROUPING SET 으둜 κ΅¬μ„±λ˜κ±°λ‚˜ ROLLUP 이 λΆ€λΆ„μ μœΌλ‘œ μ‚¬μš©
- 문제 보기 쀑 GROUPING SET (νšŒμ›λ²ˆν˜Έ, (νšŒμ›λ²ˆν˜Έ,μƒν’ˆ), ()) 이런 ν˜•νƒœμΌ 경우 
  () 이 λΆ€λΆ„μœΌλ‘œ 전체 합이 λ„μΆœλ¨

μ •λ‹΅: GROUP BY νšŒμ›λ²ˆν˜Έ, ROLLUP (μƒν’ˆ)


β–  문제 20. μ•„λž˜μ˜ SQL κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” SQL을 μ™„μ„±ν•˜μ‹œμ˜€. (ROLLUP 컬럼의 μˆœμ„œ 문제)

[SQL] 
쀑간 컬럼으둜만 GROUP BY κ°€ ν•œλ²ˆ, κ·Έ μ΄ν›„λŠ” μˆœμ„œλŒ€λ‘œ 첫번째, μ„Έλ²ˆμ§Έ 컬럼이 λ‚˜μ˜€λŠ” ν˜•νƒœ

μ •λ‹΅: ROLLUP (고객등급, 첫번째컬럼, μ„Έλ²ˆμ§Έμ»¬λŸΌ)


β–  문제 21. μ•„λž˜μ˜ SQL에 λŒ€ν•œ 결과둜 μ˜¬λ°”λ₯Έ 것은? (HAVING 절의 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•Šμ„ λ•Œμ˜ 문제)

[SQL]
SELECT COUNT(*)
FROM ...
WHERE ...
GROUP BY ID
HAVING COUNT(*) > 3

μ •λ‹΅: 1번 ( λ§Œμ‘±ν•˜λŠ” κ²°κ³Όκ°€ μ—†μœΌλ―€λ‘œ "데이터가 좜λ ₯λ˜μ§€ μ•ŠλŠ”λ‹€." )

ν•΄μ„€: 집계 결과쀑 HAVING 을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ 0 ROWS λ₯Ό λ°˜ν™˜ν•œλ‹€. 


β–  문제 22. (주문번호, νšŒμ›λ²ˆν˜Έ, μ£Όλ¬ΈκΈˆμ•‘) ν…Œμ΄λΈ”μ˜ 데이터에 λŒ€ν•œ SQL κ²°κ³Όκ°€ μ•„λž˜μ™€ 같을 λ•Œ μ˜¬λ°”λ₯Έ SQL은?

[κ²°κ³Ό]

νšŒμ›λ²ˆν˜Έ   μ΄μ£Όλ¬ΈκΈˆμ•‘
----------------
12345    500000

μ •λ‹΅: SELECT ... FROM (SELECT ... FROM ... ORDER BY ... DESC) WHERE ROWNUM = 1

ν•΄μ„€: 총 μ£Όλ¬Έ κΈˆμ•‘μ΄ κ°€μž₯ 큰 1건이 λ‚˜μ˜€λŠ”, ROWNUM=1 κ³Ό ORDER BY λ₯Ό μ–΄λ–»κ²Œ 써야 ν•˜λŠ”μ§€μ— λŒ€ν•œ 문제

INLINE VIEW μ—μ„œ ORDER BY κ²°κ³Όκ°€ λ‚˜μ˜€κ³  λ©”μΈμΏΌλ¦¬μ—μ„œ ROWNUM = 1 이 μž‘λ™ν•˜λ©΄ μœ„μ˜ κ²°κ³Όκ°€ λ‚˜μ˜΄.


β–  문제 23. μ•„λž˜μ˜ ν…Œμ΄λΈ” (주문번호, νšŒμ›λ²ˆν˜Έ, μ£Όλ¬ΈκΈˆμ•‘) μ—μ„œ μ—°λ΄‰μ˜ μˆœμ„œμ— λ”°λ₯Έ 좜λ ₯κ²°κ³Όκ°€ λ‹€μŒκ³Ό 같을 λ•Œ SQL을 μ™„μ„±ν•˜μ‹œμ˜€.

[κ²°κ³Ό]

X   100  0
Y   200  100
X   300  200

μ •λ‹΅: LAG(COL1, 1, 0)

ν•΄μ„€: LAG, LEAD (이전값, λ‹€μŒκ°’) λ₯Ό λ¬»λŠ” 문제

λ§¨μœ„μ— 0이 μžˆμœΌλ―€λ‘œ LAGλ₯Ό μž‘μ„±ν• λ•Œ LAG(COL1, 1, 0) μ΄λ ‡κ²Œ 데이터가 없을 경우 κ°€μ Έμ˜€λŠ” 값을 λͺ…μ‹œν•΄μ•Όν•¨.

#πŸ’‘μ•Œμ•„λ‘κΈ°

LAG(expr [,offset] [,default]) OVER([partition_by_clause] order_by_clause)
LEAD(expr [,offset] [,default]) OVER([partition_by_clause] order_by_clause)

LAG ν•¨μˆ˜ : 이전 ν–‰μ˜ 값을 리턴
LEAD ν•¨μˆ˜ : λ‹€μŒ ν–‰μ˜ 값을 리턴
expr : λŒ€μƒ 컬럼λͺ…
offset : 값을 κ°€μ Έμ˜¬ ν–‰μ˜ μœ„μΉ˜ 기본값은 1, μƒλž΅κ°€λŠ₯
default : 값이 없을 경우 κΈ°λ³Έκ°’, μƒλž΅κ°€λŠ₯
partition_by_clause : κ·Έλ£Ή 컬럼λͺ…, μƒλž΅κ°€λŠ₯
order_by_clause : μ •λ ¬ 컬럼λͺ…, ν•„μˆ˜

β–  λ¬Έμ œ 24. λ‹€μŒ 쀑 μ•„λž˜μ™€ 같은 ν…Œμ΄λΈ”μ—μ„œ SQL을 μ‹€ν–‰ν•  λ•Œ 결과둜 κ°€μž₯ μ μ ˆν•œ 것은? (λ…Έλž­μ΄ 113번)

[SQL]
SELECT 고객번호, 고객λͺ…, λ§€μΆœμ•‘,
       ,RANK() OVER(ORDER BY λ§€μΆœμ•‘ DESC) AS μˆœμœ„
FROM (
     SELECT A.고객번호
            ,MAX(A.고객λͺ…) AS 고객λͺ…
            ,SUM(B.λ§€μΆœμ•‘) AS λ§€μΆœμ•‘
     FROM 고객 A INNER JOIN μ›”λ³„λ§€μΆœ B
     ON (A.고객번호 = B.고객번호)
     GROUP BY A.고객번호
     )
ORDER BY μˆœμœ„;
1)                                2)
고객번호 고객λͺ… λ§€μΆœμ•‘ μˆœμœ„              고객번호 고객λͺ… λ§€μΆœμ•‘ μˆœμœ„
---------------------             ---------------------
005    이규혁  700  1               005    이규혁  700  1
004    이상화  700  1               004    이상화  700  2
002    μ΄μˆœμ‹   550  3               002    μ΄μˆœμ‹   550  3
001    홍길동  350  4               001    홍길동  350  4
003    강감찬  350  4               003    강감찬  350  5

3)                                4)
고객번호 고객λͺ… λ§€μΆœμ•‘ μˆœμœ„              고객번호 고객λͺ… λ§€μΆœμ•‘ μˆœμœ„
---------------------             ---------------------
005    이규혁  700  1               003    강감찬  350  1
004    이상화  700  1               001    홍길동  350  1
002    μ΄μˆœμ‹   550  2               002    μ΄μˆœμ‹   550  2
001    홍길동  350  3               004    이상화  700  3
003    강감찬  350  3               005    이규혁  700  3

μ •λ‹΅: 1번

ν•΄μ„€: RANK ν•¨μˆ˜λŠ” ORDER BY λ₯Ό ν¬ν•¨ν•œ μΏΌλ¦¬λ¬Έμ—μ„œ νŠΉμ • ν•­λͺ©μ— λŒ€ν•œ μˆœμœ„λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μ΄λ©° λ™μΌν•œ κ°’μ—λŠ” λ™μΌν•œ μˆœμœ„λ₯Ό 뢀여함.


β–  문제 25. μ•„λž˜μ˜ SQL 결과둜 μ˜¬λ°”λ₯Έκ²ƒμ„ κ³ λ₯΄μ‹œμ˜€. 

[κ²°κ³Ό]

1
1
2

μ •λ‹΅: DENSE_RANK() ...

ν•΄μ„€: μ •λ ¬ μˆœμ„œμ— λ”°λ₯Έ λž­ν‚Ήμ΄ 동일 λ“±μˆ˜ ν—ˆμš©, μ—°μ†λœ λ“±μˆ˜κ°€ λ‚˜μ˜€λŠ” DENSE_RANK


β–  문제 26. μ•„λž˜μ˜ μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±ν•˜λŠ” SQL을 μž‘μ„±ν•˜μ‹œμ˜€. 

...λΆ€μ„œλŠ” 사원이 없을 경우 μ‚¬μ›μˆ˜λ₯Ό 0으둜 ν‘œμ‹œν•œλ‹€.

[SQL]

SELECT ...
FROM EMP A (    ) JOIN DEPT B ...

μ •λ‹΅: RIGHT OUTERν•΄μ„€: OUTER JOIN μ—μ„œ LEFT / RIGHT ꡬ뢄을 λ¬»λŠ” 문제


β–  λ¬Έμ œ 27. λ‹€μŒ 쀑 B_Userκ°€ μ•„λž˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” DCL둜 κ°€μž₯ μ μ ˆν•œ 것은? 

(λ…Έλž­μ΄ 2κ³Όλͺ© 120번)

UPDATE A_User.TB_A
SET col1='AAA'
WHERE col2=3
1) GRANT SELECT, UPDATE TO B_User;

2) REVOKE SELECT ON A_User.TB_A FROM B_User;

3) DENY UPDATE ON A_User.TB_A TO B_User;

4) GRANT SELECT, UPDATE ON A_User.TB_A TO B_User;

μ •λ‹΅: 4번 GRANT SELECT, UPDATE ON A_User.TB A TO B_User;

ν•΄μ„€: WHERE 쑰건의 데이터λ₯Ό μ°ΎκΈ° μœ„ν•œ SELECT κΆŒν•œ 및 데이터 변경을 μœ„ν•œ UPDATE κΆŒν•œμ΄ ν•„μš”.

GRANT(κΆŒν•œλΆ€μ—¬), REVOKE(κΆŒν•œνšŒμˆ˜)

DCL(Data Control Language) 데이터 μ œμ–΄μ–΄ 에 속함.


β–  문제 28. μ•„λž˜ SQL μˆ˜ν–‰ ν›„ ν…Œμ΄λΈ” X에 λŒ€ν•œ SELECT κΆŒν•œμ„ 가지고 μžˆλŠ” μœ μ €λŠ”?

[SQL]

DBA : ... GRANT U1
DBA : ... GRANT U2 WITH GRANT OPTION
U2  : ... GRANT U3 ...
DBA : ... REVOKE U2 RESTRICT

μ •λ‹΅: DBA, U1, U2, U3

ν•΄μ„€: REVOKE λŒ€μƒ USERμ—κ²Œ κΆŒν•œμ„ 뢀여받은 μœ μ €κ°€ μžˆλ‹€λ©΄ REVOKE κ°€ μ‹€νŒ¨ν•˜κ²Œ 됨.

μ’…λ₯˜ μ„€λͺ…
WITH GRANT OPTION  μžμ‹ μ΄ 뢀여받은 κΆŒν•œμ—μ„œ λ‹€λ₯Έ μ‚¬μš©μžμ—κ²Œ κΆŒν•œ λΆ€μ—¬ κ°€λŠ₯, κΆŒν•œμ„ νšŒμˆ˜ν•  경우 μ—°μ‡„μ μœΌλ‘œ κΆŒν•œμ΄ νšŒμˆ˜λœλ‹€.
CASCADE κΆŒν•œμ œκ±° λͺ…λ Ήμ–΄ 둜 λΆ€μ—¬λœ κΆŒν•œ 트리λ₯Ό λͺ¨λ‘ μ œκ±°ν•œλ‹€.
RESTRICT κΆŒν•œμ œκ±° λͺ…λ Ήμ–΄ 둜 μ§€μ •ν•œ κΆŒν•œμ„ 제거 ν•  경우 타 μ‚¬μš©μžμ—κ²Œ 영ν–₯이 κ°€λ©΄ μ‹€νŒ¨ ν•˜λ„λ‘ μ²˜λ¦¬ν•˜λŠ” λͺ…λ Ήμ–΄

β–  문제 29. μ•„λž˜μ˜ SQL에 λŒ€ν•΄μ„œ μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠλŠ”κ²ƒμ€?

[SQL]

CREATE TABLE T1 (
    A number default 9 primary key,
    B number not null,
    C number
);

[보기]

1) INSERT INTO T1 VALUES (7,1)
2) ...
3) ...
4) INSERT INTO T1 (B, C) VALUES (9,1)

μ •λ‹΅: INSERT INTO T1 (B, C) VALUES (9, 1)

ν•΄μ„€: DEFAULTλŠ” 아무 값을 μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ κΈ°λ³Έ κ°’μœΌλ‘œ μ„€μ •ν•œ 값이 μžλ™μœΌλ‘œ μž…λ ₯λ˜λŠ” μ œμ•½μ‘°κ±΄μœΌλ‘œ NOT NULLκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 많이 μ‚¬μš©λœλ‹€.

A κ°€ DEFAULT 9 을 가지고 μžˆμœΌλ―€λ‘œ 보기 4번의 μΏΌλ¦¬λŠ” μ •μƒμ μœΌλ‘œ μž‘λ™λœλ‹€.

#πŸ’‘μ•Œμ•„λ‘κΈ°

였라클 DEFAULT μ œμ•½μ‘°κ±΄ μΆ”κ°€
[컬럼λͺ…] [νƒ€μž…] DEFAULT [κΈ°λ³Έκ°’]

πŸ“ν…Œμ΄λΈ” 생성할 λ•Œ μ„ μ–Έ
CREATE TABLE T1(
	A NUMBER DEFAULT 9
);

πŸ“ν…Œμ΄λΈ” 생성 ν›„ μ œμ•½μ‘°κ±΄ μΆ”κ°€ν•  λ•Œ
ALTER TABLE T1 MODIFY A DEFAULT 9

πŸ“DEFAULT μ œμ•½μ‘°κ±΄ μ‚­μ œ
ALTER TABLE T1 MODIFY A DEFAULT NULL

#μ‚­μ œ μ‹œ DEFAULT 기본값을 NULL둜 μž‘μ„±ν•˜λŠ” μ΄μœ λŠ” 졜초 ν…Œμ΄λΈ” μ‚½μž… μ‹œ 값이 없을 λ•Œ NULL이 λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ΄λ‹€.

β–  문제 30. μ•„λž˜μ˜ SQL결과둜 μ˜¬λ°”λ₯Έ 것은? 

INSERT ... 1
INSERT ... 2
SAVEPOINT X
UPDATE ...
DELETE ...
ROLLBACK X
INSERT ... 3

[SQL]
SELECT AVG(COL1) FROM ...

μ •λ‹΅: 2

ν•΄μ„€: (1+2+3)/3 = 2


β–  문제 31. TABLE에 λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ μ ˆν•˜μ§€ μ•Šμ€ 것은?

μ •λ‹΅: PK (쀑볡을 ν—ˆμš©ν•˜λ˜ NULL은 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.)ν•΄μ„€: PK(Primary Key / κΈ°λ³Έ ν‚€) λŠ” μ•„λž˜μ™€ 같은 νŠΉμ§•μ„ κ°–λŠ”λ‹€.- 값이 μ€‘λ³΅λ˜μ§€ μ•ŠλŠ”λ‹€.- 값을 λ°˜λ“œμ‹œ μž…λ ₯ν•΄μ•Ό ν•œλ‹€.- ν…Œμ΄λΈ” λ°μ΄ν„°μ˜ 고유 μΈμ‹λ²ˆν˜Έ 이닀. (ν…Œμ΄λΈ”λ‹Ή ν•˜λ‚˜μ˜ κΈ°λ³Έν‚€λ§Œ 지정)


β–  문제 32. μ•„λž˜μ˜ SQL에 λŒ€ν•œ 결과둜 μ˜¬λ°”λ₯Έ 것은? ( WINDOWS FUNCTION 3κ°œμ— λŒ€ν•œ 문제 )

[TABLE_32]

COL1  COL2  COL3
----------------
100   100   100
200   100   100
300   200   100
400   100   100
500   300   100
600   400   100
700   200   100

[SQL]

SELECT MAX(COL1) OVER(ORDER BY COL1 ROWS 
                      BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING) AS MAX,
       SUM(COL2) OVER(ORDER BY COL1 ROWS 
                      BETWEEN 1PRECEDING AND CURRENT ROW) AS SUM,
       FIRST_VALUE(COL1) OVER(ORDER BY COL1 RANGE 
                      BETWEEN 200 PRECEDING AND 200 FOLLOWING) AS FIRST
FROM TABLE_32;

μ •λ‹΅:

[RESULT]

MAX   SUM   FIRST
-----------------
300   100   100
400   200   100
500   300   100
600   300   200
700   400   300
700   700   400
700   600   500

ν•΄μ„€:

------------------------------

start_point와 end_point의 ꡬ성

------------------------------

- start_pointλŠ” end_point와 κ°™κ±°λ‚˜ μž‘μ€ 값이 듀어감

- Default값은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

- UNBOUNDED PRECEDING : start_point 만 λ“€μ–΄κ°ˆ 수 있으며, νŒŒν‹°μ…˜μ˜ first row

- UNBOUNDED FOLLOWING : end_point만 λ“€μ–΄κ°ˆ 수 있으며, νŒŒν‹°μ…˜μ˜ last row

- CURRENT ROW : start, end_point λ‘˜λ‹€ κ°€λŠ₯. μœˆλ„μš°λŠ” CUREENT ROWμ—μ„œ start ν•˜κ±°λ‚˜ end 함

- value_expr PRECEDING

> CURRENT ROW μ „μ˜ 물리적/논리적 OFFSET, μƒμˆ˜λ‚˜ ν‘œν˜„μ‹(EXPRESSION)이 λ“€μ–΄κ°€λ©° μ–‘μˆ˜μž„.

> RANGE에 μ‚¬μš©μ‹œ, DATE μ»¬λŸΌμ— λŒ€ν•œ INTERVAL LITERAL일 수 있음

- value_expr FOLLOWING

> CURRENT ROW ν›„μ˜ 물리적/논리적 OFFSET, value_expr PRECEDING 와 성격 동일함

​

>> MAX : νŒŒν‹°μ…˜(전체 둜우의 첫번째 ν–‰) 이 μ‹œμž‘μ μ΄λ©° 2 FOLLOWING 의 기쀀은 ν˜„μž¬ λ‘œμš°μ—μ„œ μ‹œμž‘λ¨.

즉, 각 ν–‰μ˜ λ’€μ˜ 2κ°œμ—΄κΉŒμ§€κ°€ 끝점이 됨.

>> SUM : μ‹œμž‘μ μ€ ν˜„μž¬ 둜우의 1번째 μ „ ν–‰ λΆ€ν„° 끝점은 ν˜„μž¬ 둜우둜 SUM 이 됨

>> FIRST_VALUE : μ‹œμž‘μ μ€ ν˜„μž¬ 둜우의 λ²”μœ„ κΈ°μ€€μœΌλ‘œ 200 λ‹¨μœ„ μ „(500 이면 300λΆ€ν„°) λΆ€ν„° 끝점은 ν˜„μž¬ 둜우의 λ²”μœ„ κΈ°μ€€μœΌλ‘œ 200 λ‹¨μœ„ ν›„ (500이면 700κΉŒμ§€) 의 λ²”μœ„μ—μ„œ 첫번째 κ°’


β–  문제 33. μ•„λž˜μ˜ ν…Œμ΄λΈ”κ³Ό 데이터에 λŒ€ν•œ SQL결과둜 μ˜¬λ°”λ₯Έ 것은?

[TAB1]

COL1   COL2
-----------
1       A
1       A
1       B
1       B

SELECT COUNT(COL1), COUNT(COL2)
FROM (
     SELECT DISTINCT COL1, COL2
     FROM TAB1
     )

μ •λ‹΅: 2, 2


 

β–  문제 34. μ•„λž˜μ˜ SQL에 λŒ€ν•œ μ„€λͺ…μœΌλ‘œ κ°€μž₯ μ μ ˆν•œ 것은? ( NULL이 μžˆμ„λ•Œ AVG와 COUNTκ°€ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ λ¬»λŠ” 문제 )

[SQL]

SELECT SUM(C2) / COUNT(*) AVG1,
       SUM(C2) / COUNT(C2) AVG2,
       AVG(C2) AVG3

μ •λ‹΅: AVG2와 AVG3κ°€ κ°™λ‹€. (NULL이 있으면 빠지고 평균)


β–  문제 35. μ•„λž˜μ˜ ν…Œμ΄λΈ”μ΄ μžˆμ„ λ•Œ SQL 결과둜 μ˜¬λ°”λ₯Έ 것은? ( CROSS JOIN된 이후 κ²°κ³Όμ—μ„œ 쑰인된 ν…Œμ΄λΈ” RULL μ‚¬μš© )

[TAB1]

ID  NAME
--------
1   SMITH
2   ALICE
3   SCOTT
4   ...

[TAB2]

ID  RULE
--------
1   S%
2   %T%

[SQL]
SELECT * FROM TAB1 A, TAB2 B
WHERE A.NAME LIKE B.RULE;

μ •λ‹΅: 

ID    NAME    ID   RULE
------------------------
1    SMITH    1    S%
3    SCOTT    1    S%
1    SMITH    2    %T%
3    SCOTT    2    %T%

ν•΄μ„€: RULE 컬럼의 λ‚΄μš©μ΄ λ“€μ–΄κ°€ LIKE 절 μ™„μ„± -> CROSS JOINν›„ LIKE절 체크

 


β–  문제 36. μ•„λž˜μ˜ 데이터에 λŒ€ν•œ SQL κ²°κ³Όκ°€ λ‹€λ₯Έ 것은?

1) SELECT COUNT(DISTINCT COL1)

2) SELECT DISTINCT COUNT(*)

3) SELECT * FROM ... GROUP BY ...

4) ...

μ •λ‹΅: 2


β–  문제 37. μ•„λž˜μ˜ SQL결과둜 μ˜¬λ°”λ₯Έ 것은? 

[SQL]
SELECT SUBSTR('123456789', -4, 2) FROM DUAL

μ •λ‹΅: 67

ν•΄μ„€: SUBSTR('λ¬Έμžμ—΄', μ‹œμž‘μœ„μΉ˜, κΈΈμ΄)

-4 (λ’€μ—μ„œ 4번째 자리수 λΆ€ν„°), 2자리 κΉŒμ§€ μ΄λ―€λ‘œ 67 (λ’€μ—μ„œ λΆ€ν„° λ¬Έμžμ—΄μ„ 자λ₯Όλ•Œ μ‹œμž‘μœ„μΉ˜μ— λ§ˆμ΄λ„ˆμŠ€ 값을 μž…λ ₯ν•΄μ€Œ)

*λ’€μ—μ„œλΆ€ν„° λ¬Έμžμ—΄μ„ 자λ₯Ό λ•ŒλŠ” μ‹œμž‘μœ„μΉ˜μ— 음수(-) 값을 μž…λ ₯
SUBSTR('λ¬Έμžμ—΄', μ‹œμž‘μœ„μΉ˜, 길이)
 
SUBSTR('123456789', 2): λ¬Έμžμ—΄μ˜ 두 번째 μœ„μΉ˜(2)λΆ€ν„° λ¬Έμžμ—΄ λκΉŒμ§€ (κ²°κ³Ό: 23456789)
SUBSTR('123456789', 2, 3): λ¬Έμžμ—΄μ˜ 두 번째 μœ„μΉ˜(2)λΆ€ν„° μ„Έ 자리(4)κΉŒμ§€ (κ²°κ³Ό: 234)
SUBSTR('123456789', -5): λ¬Έμžμ—΄μ˜ λ’€μ—μ„œ 두 번째 μœ„μΉ˜(5)λΆ€ν„° λ¬Έμžμ—΄ λκΉŒμ§€ (κ²°κ³Ό: 56789)
SUBSTR('123456789', -5, 3): λ¬Έμžμ—΄μ˜ λ’€μ—μ„œ 두 번째 μœ„μΉ˜(8)λΆ€ν„° λ¬Έμžμ—΄ λκΉŒμ§€ (κ²°κ³Ό: 567)

β–  문제 38. μ•„λž˜μ˜ SQL결과둜 μ˜¬λ°”λ₯Έ 것은? ( LENGTH κ²°κ³Ό μ°ΎλŠ” 문제 )

[SQL]

SELECT LENGTH('SQL EXPERT') FROM DUAL

μ •λ‹΅: 10


β–  문제 39. μ•„λž˜μ˜ μš”κ΅¬μ‚¬ν•­μ— λ§žλŠ” SQL둜 μ μ ˆν•œ 것은? ( μš”κ΅¬μ‚¬ν•­μ— 맞좘 SQL μž‘μ„± )

[μš”κ΅¬μ‚¬ν•­]
등급은 F λ˜λŠ” G 이며, λ²”μœ„λŠ” 2000 ~ 50000 사이 ...

μ •λ‹΅: AND (COL1 = F OR COL1 = G) AND ...

 


β–  문제 40. μ•„λž˜μ˜ 데이터에 λŒ€ν•œ SQL결과둜 μ˜¬λ°”λ₯Έ 것은? (NULL 이 μžˆμ„ λ•Œ μ˜€λΌν΄μ—μ„œ μ •λ ¬λ˜λŠ” μˆœμ„œ)

[TABLE40]

COL1
-----
NULL
NULL
1
2
3

[SQL]
SELECT * FROM TABLE40 ORDER BY COL1 ASC;

μ •λ‹΅: 였라클 NULL은 κ°€μž₯ ν°κ°’μœΌλ‘œ μΈμ‹λ˜λ―€λ‘œ ASC둜 μ •λ ¬ν• κ²½μš° 맨 λ§ˆμ§€λ§‰μ— λ‚˜μ˜€κ²Œ λœλ‹€.

COL1
-----
1
2
3
NULL
NULL
SELECT * FROM TABLE40 ORDER BY COL1 DESC;

#DESC 일경우 μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜΄.

COL1
-----
NULL
NULL
3
2
1

β–  문제 41. SQL 집합 μ—°μ‚°μžμ—μ„œ ꡐ집합에 ν•΄λ‹Ήν•˜λŠ” 것은?

μ •λ‹΅: INTERSECT


β–  문제 42. μ•„λž˜μ˜ SQL에 λŒ€ν•œ μ„€λͺ…μœΌλ‘œ κ°€μž₯ μ μ ˆν•œ 것은? (λΆ€μ„œλ³„ 연봉이 제일 높은 μ‚¬λžŒ μ°ΎλŠ” λ‚΄μš©)


β–  문제 43. μ•„λž˜μ˜ SQLꡬ문에 λŒ€ν•œ 결과둜 μ•Œλ§žμ€ 것은? (MERGE INTO ꡬ문에 λŒ€ν•œ μ„€λͺ…)

[TABLE_43_1]
ID  COL1
--------
1    A
2    B


[TABLE_43_2]
ID   COL2
---------
1    C
2    D
3    E
4    F

[SQL]
MERGE INTO TABLE_43_1
USING TABLE_43_2
ON ...
MATCH ... UPDATE
NOT MATCH INSERT

β–  문제 44. μ•„λž˜μ™€ 같은 SQL문에 λŒ€ν•΄ μ‚½μž…μ΄ μ„±κ³΅ν•˜λŠ” SQL 문은? ( λ…Έλž­μ΄ 2κ³Όλͺ© 20번 )

CREATE TABLE TBL (
                 ID NUMBER PRIMARY KEY,
                 AMT NUMBER NOT NULL,
                 DEGREE VARCHAR2(1)
                 )
                 
κ°€. INSERT INTO TBL VALUES(1, 100)
λ‚˜. INSERT INTO TBL(ID, AMT, DEGREE) VALUES(2, 200, 'AB')
λ‹€. INSERT INTO TBL(ID, DEGREE) VALUES(4, 'X')
라. INSERT INTO TBL(ID, AMT) VALUES(3, 300)
마. INSERT INTO TBL VALUES(5, 500, NULL)
1) κ°€, λ‚˜

2) λ‚˜, λ‹€

3) λ‹€, 라

4) 라, 마

μ •λ‹΅: 4번 라, 마

ν•΄μ„€: κ°€ - μ‚½μž… μ»¬λŸΌμ„ λͺ…μ‹œν•˜μ§€ μ•Šμ•˜μ„ 경우 λͺ¨λ“  μ»¬λŸΌμ„ μ‚½μž…ν•΄μ•Ό ν•¨λ‚˜ - DEGREE 컬럼의 κΈΈμ΄λŠ” VARCHAR2(1) 이닀. 'AB'λŠ” 컬럼 길이λ₯Ό μ΄ˆκ³Όν•¨λ‹€ - NOT NULL 컬럼인 AMT μ»¬λŸΌμ„ λͺ…μ‹œν•˜μ§€ μ•Šμ•˜μŒ


β–  λ‹¨λ‹΅ν˜• 2. λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ νŒŒμƒλœ ν…Œμ΄λΈ”λ‘œ, 물리적 데이터가 μ €μž₯λ˜λŠ” 것이 μ•„λ‹Œ λ…Όλ¦¬μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ”κ²ƒμ„ 무엇이라 ν•˜λŠ”κ°€?

μ •λ‹΅: VIEW (λ·°)


β–  λ‹¨λ‹΅ν˜• 3. μ•„λž˜μ˜ SQL κ²°κ³Όλ₯Ό μž‘μ„±ν•˜μ‹œμ˜€. 

COUNT(*) , HAVING > 2 μ΄λ©° GROUP BY κ΄€λ ¨λœ 쿼리

[TAB1]

ID     COL1
-----------
A      1
A      2
B      3
B      4
C      5
C      6
C      7
D      8

[SQL]
SELECT COUNT(*)
FROM TAB1
GROUP BY ID
HAVING COUNT(*) > 2;

 

μ •λ‹΅: 3

ν•΄μ„€: ID, COUNT(*) κ²°κ³Όλ₯Ό HAVING μ‘°κ±΄μ ˆ μ²΄ν¬ν•œ μ΅œμ’…κ²°κ³ΌλŠ” '3' 

SQL> SELECT COUNT(*) FROM TAB1 GROUP BY ID HAVING COUNT(*) > 2;

  COUNT(*)
----------
	 3

β–  λ‹¨λ‹΅ν˜• 4. μ•„λž˜μ˜ SQLκ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆλ„λ‘ λΉˆμΉΈμ„ μ±„μš°μ‹œμ˜€.

SELECT ...
FROM ...
WHERE COL ...
OR COL (      )

μ •λ‹΅: IS NULL


β–  λ‹¨λ‹΅ν˜• 5. μ•„λž˜μ˜ SQL 결과에 λ§žλŠ” SQL 을 μž‘μ„±ν•˜μ‹œμ˜€.

[κ²°κ³Ό]
ROLLUP 에 κ΄€λ ¨λœ 문제

μ •λ‹΅: ROLLUP


β–  λ‹¨λ‹΅ν˜• 6. NTILE(3) 의 κ²°κ³Όλ₯Ό μ±„μ›Œλ„£μœΌμ‹œμ˜€. ( 총 7건의 둜우 )

[κ²°κ³Ό]

  NT     COUNT(*)
( γ„± )    ( γ„΄ )
  2         2
  3         2

μ •λ‹΅: γ„±: 1 / γ„΄: 3


좜처 : λ°μ΄ν„° μ „λ¬Έκ°€ 포럼 '월야루' λ‹˜ μ™Έ νšŒμ›λ‹˜λ“€πŸ‘¨πŸ»‍πŸ’»πŸ‘©πŸ»‍πŸ’»

300x250

μ½”λ“œ