C.W.K.
Stream
Lesson 11 of 16 · published

LEFT JOIN 과 orphan finder

~12 min · queries, joins

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

관계없이 부모 유지

LEFT JOIN 이 INNER JOIN 의 친절한 사촌: 왼쪽 테이블 모든 행 보존, 오른쪽 매치 없어도. 매치 안 된 행은 오른쪽 컬럼에 NULL.

Orphan finder 패턴

LEFT JOIN ... WHERE right.id IS NULL 이 자식 없는 부모 찾음: 주문 안 한 유저, 댓글 없는 post, 리뷰 없는 product. 이 패턴이 거의 모든 분석 대시보드에 등장.

ON-vs-WHERE 함정

오른쪽 테이블 필터는 LEFT JOIN semantics 유지하려면 ON 에. LEFT JOIN 후 WHERE o.total > 100 이 주문 전혀 없는 행 조용히 떨어뜨림 (NULL 이 비교 실패) — INNER JOIN 으로 되돌림.

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 로 나옴.
Orphan 찾기·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 vs 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

갖고 있는 스키마에서 orphan-style 질문 (자식 없는 부모) 하나 찾고 LEFT JOIN + IS NULL 쿼리 작성. 카운트 추가: 부모마다 자식 몇 개, 자식 0 인 부모 포함.

Progress

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

댓글 0

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

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