📒 SQLD: 노랭이

[SQLD / 노랭이] p. 62: 49번

haeriyouu 2025. 3. 3. 17:23
-- 주어진 오라클 SQL

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A, 게시글 B
WHERE A.게시판ID = B.게시판ID(+)
AND B.삭제여부 = 'N'
AND A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

 

✏️ 정답: 1번

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A
LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND B.삭제여부 = 'N')
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

🔎 코드 분석

1️⃣ SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT

  - A.게시판ID, A.게시판 명을 조회

  - B.게시글ID를 COUNT해서 게시글 수(CNT)를 구함

  - COUNT(B.게시글ID) ➡️ B.게시글ID가 NULL이면 카운트 되지 않음. 

   💡 기본적으로 COUNT() 함수는 NULL 값을 제외하고 개수를 세기 때문에! 

2️⃣ FROM 게시판 A

  - 기준 테이블은 게시판(A)

  - A 테이블이 모든 데이터를 유지하는 기준이 됨 (LEFT OUTER JOIN 이므로!)

3️⃣ LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND B.삭제여부 = 'N')

  - A.게시판ID = B.게시판ID ➡️ 게시글(B)을 게시판(A)와 연결

  - LEFT OUTER JOIN  ➡️게시판(A)에 게시글이 없어도 NULL을 채워 유지

  - B.삭제여부 = 'N' ➡️ 삭제되지 않은('N') 게시글만 JOIN

  - B.게시판ID(+)가 ANSI SQL로 변환되면서 LEFT OUTER JOIN 사용

4️⃣ WHERE A.사용여부 = 'Y'

  - A.사용여부 = 'Y' ➡️ 사용 가능한 게시판만 조회

  - LEFT OUTER JOIN 이후에도 필터링됨

  - B.게시판ID(+) 였던 부분은 이미 ON절에서 처리되었으므로, WHERE에는 A의 조건만 유지

5️⃣ GROUP BY A.게시판ID, A.게시판명

  - 같은 게시판ID 기준으로 그룹화

  - 각 게시판ID 별로 게시글 개수(COUNT)를 계산하기 위해 필요

  - COUNT(B.게시글ID)는 NULL 값이 있으면 제외하고 개수를 셈

  - 즉, 게시판ID가 있지만 B.게시글ID가 NULL이면 COUNT = 0이 됨

6️⃣ ORDER BY A.게시판ID;

  - 게시판 ID 순으로 정렬

  - ORDER BY가 없으면 정렬 순서 보장❌

  - A.게시판ID ASC(오름차순) 정렬이 기본


📌 (+) 기호란?

✅ 오라클의 OUTER JOIN 문법에서 (+)는 NULL을 허용하는 쪽(OUTER 쪽)을 나타낸다.

💡 즉, (+)가 붙어있는 테이블이 OUTER JOIN에서 추가되는 "대상"이다!

-- Oracle SQL 예제
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A, 게시글 B
WHERE A.게시판ID = B.게시판ID(+);

🔎 B.게시판(+) ➡️ B 테이블이 OUTER JOIN의 대상

🔎 A 테이블의 데이터를 모두 유지하고, B가 없는 경우에도 NULL처리

 

📌 ANSI SQL로 변환하면?

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A
LEFT OUTER JOIN 게시글 B ON A.게시판ID = B.게시판ID;

 

오라클 구문: (+) 사용 ANSI SQL 변환: OUTER JOIN 사용
A.컬럼 = B.컬럼(+) A LEFT OUTER JOIN B ON A.컬럼 = B.컬럼
A.컬럼(+) = B.컬럼  A RIGHT OUTER JOIN B ON A.컬럼 = B.컬럼

✅ (+)가 오른쪽 ➡️ LEFT OUTER JOIN

✅ (+)가 왼쪽 ➡️ RIGHT OUTER JOIN

 

 

더보기

열심히 정리하고 이해하려고 노력은 했는데...! 막상 문제를 다시 맞딱뜨리면 동공지진날거같다 ㅎ.... 

'📒 SQLD: 노랭이' 카테고리의 다른 글

[SQLD / 노랭이] p.42: 19번  (0) 2025.03.02
[SQLD / 노랭이] p.49: 28번  (0) 2025.03.01
[SQLD / 노랭이] p.63: 50번  (1) 2025.03.01
[SQLD / 노랭이] p.50: 30번  (0) 2025.02.28
[SQLD / 노랭이] p.121: 111번  (0) 2025.02.28