Получить доступ

Как правильно проверить значение на NULL в SQL?

JuniorSQL-запросыSQL
Ещё спрашивают так:
  • Почему WHERE column = NULL ничего не находит?
  • Как работает NULL в агрегатах и NOT IN?
Коротко

NULL — «неизвестно», и любое сравнение с ним даёт UNKNOWN, а не TRUE. Поэтому проверяют только IS NULL и IS NOT NULL.

  • x = NULL и x <> NULL никогда не истинны
  • Агрегаты (sum, avg, count(col)) пропускают NULL; count(*) — считает строки
  • NOT IN (подзапрос с NULL) вернёт пустой результат — ловушка

А ещё COALESCE(x, 0) подставляет значение по умолчанию; IS DISTINCT FROM сравнивает с учётом NULL

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Трёхзначная логика. В SQL есть TRUE, FALSE и UNKNOWN. Сравнение с NULL (=, <>, >) даёт UNKNOWN, а WHERE пропускает только TRUE. Поэтому WHERE middle_name = NULL не вернёт ничего, а WHERE middle_name <> 'А' не вернёт строки с NULL.

Правильно: IS NULL, IS NOT NULL, а для сравнения двух значений с учётом NULL — IS DISTINCT FROM / IS NOT DISTINCT FROM.

Агрегаты: sum, avg, min, max, count(колонка) игнорируют NULL; count(*) считает все строки. Среднее по колонке с NULL — среднее по непустым значениям. Сумма пустого множества — NULL, а не 0.

Ловушка NOT IN: если подзапрос вернул хотя бы один NULL, x NOT IN (…) для любого x даёт UNKNOWN — результат пуст. Надёжнее NOT EXISTS.

Ещё: NULL в сортировке идут в конце (PostgreSQL, по возрастанию) или в начале — управляется NULLS FIRST/LAST; в UNIQUE несколько NULL допустимы; COALESCE возвращает первый не-NULL аргумент.

Пример

SELECT * FROM users WHERE phone IS NULL;              -- правильно
SELECT count(*), count(phone) FROM users;             -- все строки / с телефоном
SELECT * FROM a WHERE id NOT IN (SELECT a_id FROM b); -- пусто, если в b есть NULL
SELECT * FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id);  -- надёжно

Что хотят услышать

  • IS NULL вместо сравнения и почему.
  • Трёхзначная логика.
  • NULL в агрегатах и ловушка NOT IN — плюс.

Частые ошибки

  • = NULL в условии.
  • NOT IN с подзапросом, который может вернуть NULL.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗field = NULL
  • ✓field IS NULL
  • ✗field == NULL
  • ✗field EQUALS NULL

Что спросят дальше

  • Как count(*) отличается от count(column)?
  • Что такое three-valued logic?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем