WHERE u.user_id NOT IN (
SELECT user_id FROM orders
WHERE user_id IS NOT NULL
)
또는
WHERE NOT EXISTS (...)
핵심은 성능보다 조건의 의미 변화입니다. 같은 "주문 없는 사용자 찾기"라도, NOT IN은 NULL을 제거하지 않으면 모든 비교가 막힐 수 있습니다.
orders.user_id 서브쿼리 결과에 NULL이 섞여 있습니다.
안전하지 않은 NOT IN
NULL을 그대로 포함한 채 비교
안전한 방법
NULL 제거 또는 NOT EXISTS
u.user_id <> 101 AND <> 205 AND <> NULLNOT EXISTS입니다.NOT IN의 함정은 "느림"이 아니라 "NULL 때문에 결과 의미가 바뀜"입니다. 그래서 NOT IN을 쓸 때는 서브쿼리에 WHERE user_id IS NOT NULL를 반드시 붙이거나, 더 안전한 NOT EXISTS를 선택합니다.