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처럼 동작하게 됩니다.
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로 남게 됩니다.
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 JOIN 후 WHERE 조건은 결과를 크게 바꿀 수 있습니다.
✔️ 필터 조건은 JOIN 절로 옮기거나, NULL을 명시적으로 고려하세요.