[SQL] LEFT JOIN이 INNER JOIN처럼 작동하는 이유

Unit·2025년 4월 17일

SQL

목록 보기
6/59

LEFT JOIN을 썼는데도, 예상보다 결과가 적게 나오는 경우가 있습니다.
쿼리 문법은 틀리지 않았지만, 데이터가 일부 누락된 느낌이 들죠.
이럴 땐 WHERE절에 걸린 조건을 의심해볼 필요가 있습니다.


❗ 문제 상황

SELECT u.user_id
     , o.order_id
FROM users u
LEFT JOIN orders o
  ON u.user_id = o.user_id
WHERE o.status = 'done';

이 쿼리는 LEFT JOIN을 썼지만, WHERE o.status = 'done' 조건 때문에 o.status가 NULL인 행은 모두 제거됩니다.

즉, 주문이 없는 사용자는 결과에서 제외되며, 결국 INNER JOIN처럼 동작하게 됩니다.


✅ 해결 방법 1 : 조건을 JOIN 절로 이동

SELECT u.user_id
     , o.order_id
FROM users u
LEFT JOIN orders o 
  ON u.user_id = o.user_id
 AND o.status = 'done';

→ 이 방법은

  • 모든 사용자를 유지하면서
  • 주문이 done 상태인 경우에만 order_id가 채워집니다.

주문이 없거나 done이 아닌 경우는 order_id = NULL로 남게 됩니다.


✅ 해결 방법 2 : WHERE절에서 NULL도 고려

SELECT u.user_id
     , o.order_id
FROM users u
LEFT JOIN orders o
  ON u.user_id = o.user_id
WHERE o.status = 'done'
   OR o.status IS NULL;

done 상태인 주문과, 주문 자체가 없는 사용자 모두 결과에 포함됩니다.


⚠️ 왜 이렇게 될까?

LEFT JOIN왼쪽 테이블의 모든 행을 유지하고, 조건에 맞는 오른쪽 테이블의 값만 붙이는 방식입니다.
그런데 WHERE절에서 o.status = 'done'과 같이 조건을 걸면, o.status가 NULL인 행까지 제거되면서 결과적으로 INNER JOIN처럼 동작하게 됩니다.


정리

✔️ LEFT JOINWHERE 조건은 결과를 크게 바꿀 수 있습니다.
✔️ 필터 조건은 JOIN 절로 옮기거나, NULL을 명시적으로 고려하세요.

profile
협업, 유지보수, 최적화를 고려한 데이터 실무 팁을 정리합니다.

0개의 댓글