EMZETT.
Войти

NULL в SQL и трёхзначная логика

Коротко: В SQL NULL означает «неизвестно», а не «пусто» или «ноль». Сравнения с NULL дают не истину и не ложь, а тоже «неизвестно».

Подробнее: В SQL три значения истинности: TRUE, FALSE, UNKNOWN. Строка попадает в результат WHERE только если условие TRUE.

Подробности

  • Сравнения: NULL = NULL — UNKNOWN, а не TRUE. Поэтому используйте IS NULL и IS NOT NULL. Для равенства с учётом NULL: IS NOT DISTINCT FROM.
  • Типичная ловушка: WHERE status <> 'x' не возвращает строки с status IS NULL.
  • NOT IN: x NOT IN (1, 2, NULL) никогда не даёт TRUE, потому что сравнение с NULL — UNKNOWN. Лучше NOT EXISTS.
  • Арифметика: 5 + NULL — NULL. COALESCE(a, 0) заменяет NULL значением по умолчанию.
  • Агрегаты: COUNT(*) считает строки, COUNT(столбец) — только значения не NULL. SUM и AVG игнорируют NULL.
  • Сортировка: NULL стоит в начале или в конце в зависимости от системы. NULLS FIRST/LAST это фиксирует.
  • Проектирование: По возможности объявляйте NOT NULL со значением по умолчанию.

См. также: понятие NULL, SQL