Anti-Join 판별

왼쪽 행은 남기고, 오른쪽 행이 비어 있을 때만 걸러낸다

Anti-Join은 A에는 있지만 B에는 없는 행을 찾는 비교입니다. 핵심은 LEFT JOIN 뒤에 오른쪽 테이블의 행이 실제로 붙었는지를 보는 것입니다.

users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE o.order_id IS NULL
LEFT JOIN 결과 해석
주문이 붙은 회원
주문이 없는 회원
오른쪽 값
o.order_id = 17 orders 행이 실제로 매칭되었으므로 오른쪽 PK 값이 채워집니다.
o.order_id = NULL 붙을 orders 행이 없어서 오른쪽 컬럼 전체가 비어 보입니다.
WHERE 통과 여부
통과하지 않음 IS NULL 조건이 거짓이므로 결과에서 빠집니다.
통과 매칭 실패가 그대로 드러나므로 Anti-Join 결과에 남습니다.
업무 의미
이미 주문한 회원 A와 B가 연결되어 있으므로 “없는 것” 찾기 대상이 아닙니다.
회원은 있지만 주문은 없음 바로 이 열이 A에는 있고 B에는 없는 행입니다.
왜 PK를 검사할까? “매칭 실패로 생긴 NULL”과 “원래 값이 NULL인 컬럼”을 구분해야 합니다.
o.order_id IS NULL 안전한 검사

PK / NOT NULL 컬럼은 매칭된 orders 행이 있으면 반드시 값이 있습니다. 그래서 NULL이면 진짜로 주문 행이 없는 상태라고 해석할 수 있습니다.

o.note IS NULL 위험한 검사

원래 NULL 가능 컬럼은 주문이 있어도 값이 비어 있을 수 있습니다. 그러면 주문이 없는 회원과 주문은 있지만 note만 NULL인 회원이 섞입니다.