기본 패턴
text
SELECT u.id, u.name, p.title
FROM users AS u
LEFT JOIN posts AS p ON p.user_id = u.id;설명
LEFT JOIN은 왼쪽 테이블의 행을 기준으로 삼고, 오른쪽에 대응되는 값이 없더라도 왼쪽 행을 유지합니다.- 대응되는 오른쪽 행이 없으면 오른쪽 열 값은
NULL로 채워집니다. - 그래서 "아직 글을 쓰지 않은 사용자도 포함해 전체 사용자 목록을 보고 싶다" 같은 요구에 잘 맞습니다.
INNER JOIN은 양쪽에 모두 일치하는 행만 남기지만,LEFT JOIN은 "없는 데이터도 의미 있는 상태"일 때 강점을 가집니다.- 결과에서
NULL이 보인다면 쿼리가 틀린 것이 아니라, 관계가 아직 만들어지지 않았다는 신호일 수 있습니다.
짧은 예제
text
SELECT u.name, p.title
FROM users AS u
LEFT JOIN posts AS p ON p.user_id = u.id
WHERE u.active = true
ORDER BY u.name;빠른 정리
| JOIN 종류 | 결과 특징 |
|---|---|
JOIN 또는 INNER JOIN | 양쪽에 모두 일치하는 행만 남김 |
LEFT JOIN | 왼쪽 행은 모두 유지 |
오른쪽 열의 NULL | 연결된 행이 없음을 의미 |
ON 조건 | 어떤 관계를 기준으로 묶을지 결정 |
주의할 점
LEFT JOIN 뒤에 오른쪽 테이블 조건을 WHERE p.id IS NOT NULL처럼 걸면, 사실상
INNER JOIN처럼 동작할 수 있습니다. "없는 행도 살려 둘 것인가"를 먼저 생각하고
조건이 ON에 들어갈지 WHERE에 들어갈지 정하는 편이 좋습니다.
참고 링크
1 sources