본문 바로가기
C.W.K.
Stream
Lesson 04 of 10 · published

LEFT JOIN — 외로운 row 살리기

~12 min · joins, left-join, outer-join

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Outer join은 짝 없는 row도 살려

LEFT JOIN은 왼쪽 테이블의 row를 전부 돌려주고, 짝이 없으면 오른쪽 컬럼을 NULL로 채워. join이 짝을 못 찾더라도 한쪽 row는 다 살려두고 싶을 때 쓰는 거야.

SQLite는 LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN을 다 지원해. 뒤의 둘은 2022년 3.39에 들어왔어. 그래서 옛날 코드나 오래된 Stack Overflow 답변은 LEFT JOIN 두 개를 UNION으로 붙여 흉내 내지.

Tip: LEFT JOIN ... WHERE rhs.col IS NULL이 'A에는 있고 B에는 없는 row'를 찾는 정통 패턴이야. 같은 뜻인 NOT EXISTS 형태보다 눈에 자연스럽게 읽혀.

Code

Author별 post count (글 안 쓴 author는 0)·sql
SELECT a.id, a.name, count(p.id) AS post_count
FROM   authors a
LEFT   JOIN posts p ON p.author_id = a.id
GROUP  BY a.id
ORDER  BY post_count DESC;
A에 있고 B에 없는 row·sql
-- 글 안 쓴 author
SELECT a.id, a.name
FROM   authors a
LEFT   JOIN posts p ON p.author_id = a.id
WHERE  p.id IS NULL;

External links

Exercise

authors와 posts를 놓고 논리적으로 같은 query를 두 가지로 써봐. LEFT JOIN에 WHERE IS NULL을 붙인 것과 NOT EXISTS subquery. EXPLAIN QUERY PLAN으로 둘을 비교해. 하나 더 해보자. author마다 가장 최근 post의 title을 뽑되 글이 없으면 NULL이 나오게. LEFT JOIN에 상관 subquery를 붙이든 window function을 쓰든 네 마음이야.

Progress

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

댓글 0

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

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