ПрограммированиеSQL разработчик

Поясните, как работает обработка NULL в SQL. Чем опасны неожиданные значения NULL, как с ними правильно работать, и какие типичные ошибки встречаются?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В SQL значение NULL обозначает "неизвестное" или "отсутствующее" значение. Оно ведёт себя по-особому:

  • Сравнение NULL с любым значением через = или <> всегда даёт результат UNKNOWN, а не TRUE или FALSE.
  • Проверять наличие NULL нужно с помощью IS NULL или IS NOT NULL.
  • Любая арифметическая или логическая операция с NULL даст NULL.

Пример:

SELECT * FROM users WHERE name = NULL; -- не вернёт ни одной строки SELECT * FROM users WHERE name IS NULL; -- корректно SELECT 1 + NULL; -- Результат: NULL

Для замены NULL используют функции вроде COALESCE(foo, 0) (берёт первое не-NULL значение) или ISNULL(foo, 'default') в SQL Server.

Вопрос с подвохом.

Вопрос: Какой результат вернёт условие WHERE some_column <> 'value' в строках, где some_column — NULL?

Ответ:

В этих строках условие не выполнится: сравнение с NULL даст UNKNOWN, а не TRUE. Поэтому строки с NULL не попадут в выборку.

Пример:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Строка с NULL не попадёт

История

В отчёте банка условие WHERE status <> 'closed' ошибочно не учитывало счета со значением status = NULL (например, новые заявки). В результате некорректно посчитали активные счета — число оказалось на 15% меньше.

История

В интернет-сервисе персонализации писем COALESCE(user_name, 'Уважаемый клиент') забыли добавить в рассылку. Почти тысячи клиентов получили обращения без имени вообще, что восприняли как ошибку автоматизации.

История

При миграции базы LEFT JOIN возвращал больше строк, чем ожидали. Оказалось, в левой таблице были поля с NULL; фильтры вида WHERE b.field = 'X' после JOIN отбрасывали эти строки, отчего часть данных потерялась.