Sobes.tech
Назад к вопросам
Middle
16

Как работать с NULL в SQL?

Компании, где спрашивали
ИннотехИннотех
СамокатСамокат

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что NULL — это не значение, а отсутствие значения, и с ним нельзя работать как с обычными данными. Важно знать, что сравнение через = и <> для NULL не работает, поэтому используются IS NULL и IS NOT NULL. Также полезно упомянуть COALESCE, CASE и особенности JOIN/агрегаций.

Определение:

NULL в SQL означает неизвестное, отсутствующее или неприменимое значение. Это не ноль и не пустая строка, а специальный маркер "нет данных". Из-за этого NULL требует отдельной логики в фильтрации, сравнениях, сортировках и вычислениях.

Пример использования:

Допустим, в таблице users у части пользователей не указан email. Тогда нужно выбрать только тех, у кого email отсутствует, или подставить значение по умолчанию.

-- Пользователи без email
SELECT id, name
FROM users
WHERE email IS NULL;

-- Подставить значение по умолчанию
SELECT id, name, COALESCE(email, 'не указан') AS email
FROM users;

Пояснение кода:

В первом запросе используется IS NULL, потому что обычное сравнение email = NULL не даст ожидаемого результата. SQL не считает NULL равным чему-либо, даже другому NULL.

Во втором запросе COALESCE(email, 'не указан') возвращает первое не-NULL значение. Если email заполнен, он попадёт в результат, если нет — будет показана строка 'не указан'.

Если нужно обработать несколько вариантов, COALESCE проверяет их по порядку и берёт первый доступный.

Ключевые моменты:

  • NULL — это отсутствие значения, а не 0 и не пустая строка.
  • Для проверки используйте только IS NULL и IS NOT NULL.
  • Сравнения с = и <> для NULL не работают как для обычных значений.
  • Для замены NULL на значение по умолчанию часто используют COALESCE.
  • В агрегатах COUNT(column) обычно не считает NULL, а COUNT(*) считает строки целиком.
  • В JOIN и условиях фильтрации NULL может давать неожиданные результаты, поэтому логику нужно проверять отдельно.