LEFT JOIN 처리 순서

같은 조건도 언제 적용하느냐에 따라 결과가 달라집니다

ON은 조인 중 매칭 규칙이고, WHERE는 조인이 끝난 뒤 최종 결과를 다시 거르는 필터입니다.

1

기준은 항상 왼쪽 테이블입니다

users 의 회원 행은 LEFT JOIN이라 먼저 확보됩니다.

2

오른쪽 주문을 붙일 수 있으면 붙입니다

매칭이 없거나 조건에 맞지 않으면 오른쪽 값은 NULL 로 채워집니다.

3

이후 조건 위치가 결과를 갈라놓습니다

같은 o.status = 'DELIVERED' 도 ON 에 둘지, WHERE 에 둘지에 따라 해석이 달라집니다.

조건을 ON에 둠

무엇을 붙일지만 제한하고, 회원 행은 남깁니다

적용 시점

LEFT JOIN ... ON ... AND o.status = 'DELIVERED' 처럼 조인 중에 검사합니다.

NULL 행

조건에 맞는 주문이 없어도 회원은 보존됩니다. 예: 이영희 | NULL | NULL

읽는 의미

"배송 완료 주문만 붙이되, 모든 회원은 본다"는 뜻입니다.

조건을 WHERE에 둠

조인 후 다시 걸러서, NULL 행까지 제거합니다

적용 시점

WHERE o.status = 'DELIVERED' 가 조인 완료 후 전체 결과를 다시 검사합니다.

NULL 행

NULL 도 필터 대상이라 이영희, 박민수 같은 OUTER 행이 제거됩니다.

읽는 의미

"배송 완료 주문이 있는 회원만 남긴다"가 되어 LEFT JOIN이 INNER JOIN처럼 축소됩니다.

핵심 규칙

ON = 무엇을 붙일지, WHERE = 무엇을 남길지. OUTER JOIN에서 오른쪽 테이블 조건은 보통 ON 에 두어야 보존 행이 사라지지 않습니다.