Короткий ответ
В SQL NULL означает неизвестное значение. Выражение email = NULL даёт UNKNOWN, а фильтр WHERE сохраняет только строки, для которых условие равно TRUE.
Как это работает подробнее
SQL использует трёхзначную логику: TRUE, FALSE и UNKNOWN. Сравнение неизвестного значения через =, <> или != не может подтвердить ни равенство, ни неравенство.
Проверки IS NULL и IS NOT NULL специально предназначены для отсутствующих значений и возвращают обычный логический результат.
Пример кода
query.sql
SELECT customer_id, email
FROM customers
WHERE email IS NULL OR email = '';Что использовать на практике
- Различайте пропуск и пустую строку. Для обоих случаев используйте
email IS NULL OR email = ''. - Для отрицания подзапроса. Предпочитайте
NOT EXISTS, если результат подзапроса может содержатьNULL.
Подводные камни
- Неверное отрицание.
email != NULLтакже возвращаетUNKNOWN, а не заполненные email. - NOT IN. Один
NULLв списке способен сделать проверку отсутствия неизвестной для всех строк.