NULL и сравнения — почему = и <> с NULL не работают!



NULL в SQL — не значение, а его отсутствие. Из-за этого любые обычные сравнения с NULL ведут себя не так, как ожидают, и часто ломают фильтрацию.

Таблица:
users(id, email, deleted_at)

Нужно выбрать неудалённых пользователей.

Типичный, но неправильный запрос:
SELECT *
FROM users
WHERE deleted_at = NULL;


Запрос выполнится, но вернёт 0 строк.

Почему так — SQL выражение:
deleted_at = NULL

никогда не бывает TRUE.

Любое сравнение с NULL (=, <>, <, >) возвращает UNKNOWN, а WHERE пропускает только TRUE.

То же самое с отрицанием:
WHERE deleted_at <> NULL;

Результат — тоже пусто.

Правильный способ — IS NULL:
SELECT *
FROM users
WHERE deleted_at IS NULL;


И обратное условие:
SELECT *
FROM users
WHERE deleted_at IS NOT NULL;


IS NULL и IS NOT NULL — всегда возвращают TRUE или FALSE, никогда UNKNOWN.

Частая скрытая ошибка в составных условиях:
WHERE status = 'active'
AND deleted_at <> '2026-01-01'


Если deleted_at равен NULL, всё выражение становится UNKNOWN, и строка отбрасывается, даже если status = 'active'.

Корректная проверка «не удалён»:
WHERE status = 'active'
AND deleted_at IS NULL


Важно помнить про OR:
WHERE role = 'admin'
OR deleted_at IS NULL


Здесь логика работает ожидаемо, потому что IS NULL не возвращает UNKNOWN, а значит выражение может стать TRUE.

Практические правила: = и <> с NULL не работают в WHERE; любой UNKNOWN в WHERE — строка отбрасывается. Если строка пропала из результата — первым делом проверяй условия с NULL.

SQL Ready | #практика
Просмотры: 606
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти