본문 바로가기
C.W.K.
Stream
Lesson 11 of 16 · published

LEFT JOIN과 고아 행 찾기

~12 min · queries, joins

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

왼쪽 행은 모두 남긴다

LEFT JOIN은 오른쪽에 짝이 없어도 왼쪽 행을 보존하고, 없는 오른쪽 열을 NULL로 채워. 고객은 모두 보되 주문이 있는 경우에만 주문 정보를 붙이는 질의에 맞아.

없는 관계를 찾는 고전적인 모양

LEFT JOIN ... WHERE right.id IS NULL은 짝이 없는 행을 찾아. 주문이 0건인 사용자나 상품이 없는 범주를 찾을 때 유용해. 예를 들어 주문이 없는 사용자를 찾는 식이지.

ON과 WHERE의 위치가 결과를 바꿔

오른쪽 조건을 ON이 아니라 WHERE에 두면 NULL로 채운 행이 사라져 INNER JOIN처럼 변할 수 있어. 예를 들어 WHERE o.total > 100을 어디에 두는지 의식해야 해. 행 수를 셀 때도 COUNT(*)은 보존된 왼쪽 행까지 세지만 COUNT(o.id)는 실제로 짝이 있는 오른쪽 행만 세.

Code

모든 사용자를 남기고 주문이 있으면 함께 보기·sql
SELECT u.name, o.id AS order_id, o.total
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id
ORDER  BY u.name, o.placed_at;
-- Carol, 주문 없어도, 오른쪽 컬럼 NULL 로 나옴.
부모가 없는 행 찾기·sql
-- 주문 한 번도 안 한 유저
SELECT u.id, u.name
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE  o.id IS NULL;

-- 한 번도 안 팔린 product
SELECT p.id, p.title
FROM   products p
LEFT JOIN line_items li ON li.product_id = p.id
WHERE  li.id IS NULL;
ON과 WHERE의 차이가 만드는 INNER JOIN 버그·sql
-- 틀림: 오른쪽 WHERE 가 매치 안 된 왼쪽 행 제외
SELECT u.name, o.total
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE  o.total > 100;
-- Carol 사라짐 — 오른쪽이 NULL → > 100 실패.

-- 맞음: ON 안에서 필터
SELECT u.name, o.total
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id AND o.total > 100;
-- Carol 유지; 주문 컬럼 NULL.

External links

Exercise

가지고 있는 스키마에서 자식이 없는 부모를 찾는 질문 하나를 정해 LEFT JOIN과 IS NULL로 질의를 작성해. 이어서 자식이 0개인 부모도 포함해 부모별 자식 수를 세어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.