-- 주어진 오라클 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 |