SQL에서 쿼리를 짜다 보면, NULL 값과 비교할 일이 꽤 많습니다.
그런데 아래처럼 작성했을 때, 결과가 전혀 나오지 않았던 적 있지 않나요?
-- ❌
SELECT *
FROM users
WHERE deleted_at = NULL;
처음에는 문법 오류가 아니라서 문제를 눈치채지 못하기도 합니다.
그런데 결과가 비어 있는 걸 보면 이상하다는 느낌이 들죠.
SQL에서 NULL은 "값이 없다"는 상태를 의미합니다.
즉, NULL은 어떤 값과도 같지 않으며, 자체적으로 비교할 수 없는 값이에요.
그래서 = NULL, <> NULL 같은 연산은 항상 결과가 UNKNOWN이 되고,
WHERE 절에서 필터링이 되지 않습니다.
-- ✅
SELECT *
FROM users
WHERE deleted_at IS NULL;
마찬가지로, NULL이 아닌 값을 찾고 싶다면 IS NOT NULL을 사용해야 해요.
-- ✅
SELECT *
FROM users
WHERE deleted_at IS NOT NULL;
✔️ NULL은 값이 없음을 의미하는 상태입니다.
✔️ = NULL은 작동하지 않고, 반드시 IS NULL / IS NOT NULL을 사용해야 합니다.
✔️ WHERE 절뿐 아니라, 모든 조건문에서 동일하게 적용됩니다.
이제 = NULL을 쓰는 실수는 없겠죠?
사소해 보여도, NULL 비교 실수는 결과를 완전히 바꿔놓을 수 있습니다.