[SQL] NOT IN 썼는데 결과값이 없다면, NULL 때문일 수 있습니다

Unit·2025년 6월 12일

SQL

목록 보기
19/59

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로 바꾸면 안전하게 동작합니다.

profile
협업, 유지보수, 최적화를 고려한 데이터 실무 팁을 정리합니다.

0개의 댓글