PostgreSQL조회와 필터링

LEFT JOIN과 NULL 읽기

연결된 데이터가 없는 행까지 함께 보고 싶을 때 쓰는 LEFT JOIN과 결과의 NULL을 해석하는 방법을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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