LEFT JOIN이 INNER JOIN처럼 보이는 이유

LEFT JOIN은 먼저 3행을 만들지만, WHERETRUE가 아닌 행을 다시 지웁니다.

비매칭 사용자도 조인 직후에는 남아 있지만, 오른쪽 테이블 값이 NULL이면 비교 결과가 UNKNOWN이어서 최종 결과에서 탈락합니다.

이 쿼리에서 실제로 일어나는 일
WHERE o.status = 'DELIVERED'

핵심 규칙: WHERETRUE만 통과시킵니다. NULL = 'DELIVERED'UNKNOWN이므로 남지 않습니다.

김철수
order_id = 1 | status = 'DELIVERED'
오른쪽 값이 존재하고 조건과 일치
TRUE
조건을 만족
남음
최종 결과 1행
이영희
order_id = NULL | status = NULL
LEFT JOIN이라 조인 직후에는 보존됨
UNKNOWN
NULL 비교라 TRUE가 아님
제거
WHERE 단계에서 탈락
박민수
order_id = NULL | status = NULL
주문이 없어도 LEFT JOIN 때문에 한 번은 등장
UNKNOWN
NULL 행도 예외 없이 필터링
제거
INNER JOIN처럼 좁아짐
정리: 보존해야 할 행이 오른쪽 테이블 조건 때문에 WHERE에서 사라지므로, OUTER JOIN의 효과를 유지하려면 그런 조건은 보통 ON 절에 둡니다.