3-6 연습 문제 — JOIN 핵심,
직접 이어본 테이블만 내 것이 된다
INNER JOIN·LEFT JOIN·IS NULL 패턴·4-테이블 체인 — 방금 배운 무기를 바로 손에 쥐어봅니다. 눈으로 읽은 SQL은 내일이면 사라지지만, 직접 짜본 SQL만 머리에 남습니다. 막히면 정답 대신 힌트부터 받으세요.
풀기 전에 — 무기 점검
완료 ✓
완료 ✓
완료 ✓
지금 여기
다음 마일스톤
2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 막히면 정답이 아니라 힌트만 요청하고 — “정답 말고 힌트만 줘” — 다 푼 뒤에는 본인 SQL과 결과를 던지면서 “이 결과가 맞는지 검증해줘” 라고 물어보세요. 직접 틀려본 경험이 곧 검증 능력의 재료가 됩니다.
문제 1. 회원별 주문 수 (전체 회원)
모든 회원 의 이름과 주문 수를 구하세요. 주문 0인 회원도 포함 해야 합니다 (LEFT JOIN). 주문 많은 순으로 정렬.
| member_name | 주문수 |
|---|---|
| 김철수 | 6 ← 첫 줄 |
| ⋮ | |
| ? | 0 ← 마지막 4명은 주문수 0 |
정답 보기
SELECT
m.member_name,
COUNT(o.order_id) AS 주문수
FROM
members m
LEFT JOIN orders o
ON m.member_id = o.member_id
GROUP BY
m.member_id,
m.member_name
ORDER BY
주문수 DESC;주문 0인 회원이 1로 잡힙니다
LEFT JOIN 은 주문 없는 회원도 한 행(주문 칸은 전부 NULL)으로 살려두는데, COUNT(*) 는 그 NULL 행까지 세버립니다.
NULL 은 세지 않습니다
COUNT(컬럼) 은 NULL 을 건너뛰므로 — 주문 없는 회원이 정확히 0 으로 카운트됩니다.
문제 2. 주문 안 한 회원 찾기
한 번도 주문을 하지 않은 회원의 이름 을 구하세요. (LEFT JOIN + IS NULL 패턴)
| member_name |
|---|
| 황태웅 |
| 안소영 |
| 류재민 |
| 백서윤 |
정답 보기
SELECT
m.member_name
FROM
members m
LEFT JOIN orders o
ON m.member_id = o.member_id
WHERE
o.order_id IS NULL;문제 3 (도전). 도서를 산 회원
도서 카테고리(category_id = 4) 상품을 한 번이라도 산 적이 있는 회원의 이름 을 구하세요. 중복 없이.
기대 결과: 도서를 구매한 회원 (중복 제거)
정답 보기
SELECT DISTINCT
m.member_name
FROM
members m
JOIN orders o
ON m.member_id = o.member_id
JOIN order_items oi
ON o.order_id = oi.order_id
JOIN products p
ON oi.product_id = p.product_id
WHERE
p.category_id = 4
ORDER BY
m.member_name;세 문제 모두 직접 짜봤다면 JOIN 의 핵심은 손에 들어온 겁니다. 그런데 문제 3 같은 체인 JOIN, 조건 하나만 어긋나면 결과가 조용히 뻥튀기되는 함정 이 있습니다 — 이 강의에서 가장 중요한 별표 강의로 갑니다.