SQL에서 NOT IN을 사용하다가, 결과가 예상과 다르게 아예 안 나온 적이 있으신가요?
-- ❌ 탈퇴한 유저를 제외하려는 쿼리
SELECT *
FROM users
WHERE id NOT IN (
SELECT user_id
FROM deactivated_users
);
왜 그런 결과가 나왔을까요?
SQL에서 NULL은 "값이 없다"는 상태이기 때문에,
어떤 값과도 직접 비교할 수 없습니다.
따라서 id != NULL 같은 조건은 항상 UNKNOWN으로 평가되고,
NOT IN 안에 NULL이 포함되어 있으면 전체 조건이 무효 처리됩니다.
NULL을 제거하거나, NOT EXISTS를 사용하는 방식이 있습니다.
-- ✅ NULL 제거
SELECT *
FROM users
WHERE id NOT IN (
SELECT user_id
FROM deactivated_users
WHERE user_id IS NOT NULL
);
-- ✅ NOT EXISTS 사용
SELECT *
FROM users u
WHERE NOT EXISTS (
SELECT 1
FROM deactivated_users d
WHERE d.user_id = u.id
);
✔️ NOT IN 안에 NULL이 있으면 조건 전체가 무효 처리됩니다.
✔️ IS NOT NULL로 필터링하거나, NOT EXISTS로 바꾸면 안전하게 동작합니다.