ON은 조인 중 매칭 규칙이고, WHERE는 조인이 끝난 뒤 최종 결과를 다시 거르는 필터입니다.
users 의 회원 행은 LEFT JOIN이라 먼저 확보됩니다.
매칭이 없거나 조건에 맞지 않으면 오른쪽 값은 NULL 로 채워집니다.
같은 o.status = 'DELIVERED' 도 ON 에 둘지, WHERE 에 둘지에 따라 해석이 달라집니다.
LEFT JOIN ... ON ... AND o.status = 'DELIVERED' 처럼 조인 중에 검사합니다.
조건에 맞는 주문이 없어도 회원은 보존됩니다. 예: 이영희 | NULL | NULL
"배송 완료 주문만 붙이되, 모든 회원은 본다"는 뜻입니다.
WHERE o.status = 'DELIVERED' 가 조인 완료 후 전체 결과를 다시 검사합니다.
NULL 도 필터 대상이라 이영희, 박민수 같은 OUTER 행이 제거됩니다.
"배송 완료 주문이 있는 회원만 남긴다"가 되어 LEFT JOIN이 INNER JOIN처럼 축소됩니다.
ON = 무엇을 붙일지, WHERE = 무엇을 남길지. OUTER JOIN에서 오른쪽 테이블 조건은 보통 ON 에 두어야 보존 행이 사라지지 않습니다.