[SQL] LEFT JOIN 구문 잘쓰기

JIEUM KIM·2025년 9월 1일

Database

목록 보기
8/9
post-thumbnail

SQL에서 테이블 데이터를 하나로 합칠 때 JOIN을 쓴다. 그중 LEFT JOIN은 기준 테이블의 데이터를 전부 유지하면서 다른 테이블 데이터를 붙이는 데 유용하다.

INNER JOIN의 한계

먼저 두 테이블을 보자.

musics 테이블

idtitleartistcategory_id
1DynamiteBTS101
2Hype BoyNewJeans102
3DittoNewJeans102
4SevenJungkookNULL
5Super ShyNewJeans103

music_categories 테이블

idname
101K-Pop
102Dance
103Pop

musics 테이블의 모든 음악에 카테고리 이름을 붙이고 싶다. 처음엔 INNER JOIN을 떠올릴 수 있다.

SELECT
  m.title,
  c.name AS category_name
FROM
  musics AS m
INNER JOIN
  music_categories AS c ON m.category_id = c.id;

INNER JOIN 결과

titlecategory_name
DynamiteK-Pop
Hype BoyDance
DittoDance
Super ShyPop

결과에서 'Seven'이 빠졌다. 왜? musics 테이블에서 'Seven'의 category_id가 NULL이라 music_categories와 매칭되는 레코드가 없기 때문이다. INNER JOIN은 양쪽 테이블 조건이 맞는 레코드만 반환해서, 매칭 안 되는 데이터는 제외된다. 근데 나는 카테고리가 없어도 모든 음악을 보려고 한다.

LEFT JOIN

LEFT JOIN은 INNER JOIN의 한계를 해결한다. FROM 절의 왼쪽 테이블의 모든 레코드를 기준으로 삼는다. 오른쪽 테이블에서 매칭되는 데이터를 찾아 붙이고, 없으면 NULL로 채운다.

INNER JOIN 대신 LEFT JOIN으로 쿼리를 다시 짜보자.

SELECT
  m.title,
  c.name AS category_name
FROM
  musics AS m
LEFT JOIN
  music_categories AS c ON m.category_id = c.id;

LEFT JOIN 결과

titlecategory_name
DynamiteK-Pop
Hype BoyDance
DittoDance
SevenNULL
Super ShyPop

이제 'Seven'이 결과에 포함되며 category_name은 NULL이지만, musics 테이블의 모든 데이터가 유지되는 것을 볼 수 있다.


REFERENCES
https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/https://makand.tistory.com/entry/SQL-LEFT-JOIN-%EA%B5%AC%EB%AC%B8
https://makand.tistory.com/entry/SQL-LEFT-JOIN-%EA%B5%AC%EB%AC%B8

0개의 댓글