Как работает NULL в SQL
Вопрос
Объясни, что такое NULL в SQL и какие ловушки с ним связаны.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
NULL означает «значение неизвестно», а не ноль и не пустую строку
Сравнение с NULL через = или <> даёт unknown, WHERE такие строки отбрасывает; проверка через IS NULL
NOT IN со списком или подзапросом, где есть NULL, возвращает пустой результат
Агрегаты кроме COUNT(*) игнорируют NULL, SUM на пустом наборе даёт NULL
COALESCE подставляет значение по умолчанию, IS DISTINCT FROM сравнивает с учётом NULL
Что могут спросить следом
- Почему
WHERE city <> 'Москва'теряет строки? - Как сделать уникальный индекс, если колонка может быть NULL?
- Чем NULL отличается от пустой строки в PostgreSQL?
Разбор
NULL в SQL означает отсутствие или неизвестность значения. Из-за этого в SQL трёхзначная логика: любое сравнение с NULL, даже NULL = NULL, даёт не true и не false, а unknown, а WHERE пропускает только true. Поэтому email = NULL всегда пусто, проверяют через IS NULL. Вторая ловушка: city <> 'Москва' теряет строки с пустым городом. Третья, самая опасная: NOT IN по подзапросу, где есть хоть один NULL, вернёт пустой результат, поэтому для «нет в списке» лучше NOT EXISTS. Четвёртая: агрегаты, кроме COUNT(*), пропускают NULL, AVG считает среднее только по известным, а SUM на пустом наборе даёт NULL, отсюда COALESCE(SUM(x), 0). Для сравнения с учётом NULL есть IS DISTINCT FROM. И в PostgreSQL пустая строка это значение, а не NULL, в отличие от Oracle.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.