NULL и проверка на пустоту

Разбираемся со специальным значением NULL и тем, как с ним работать.

NULL — это не ноль и не пустая строка, а отметка «значение отсутствует или неизвестно».

Что такое NULL

NULL означает «данных нет». У пользователя может быть не указан телефон, у заказа — не проставлена дата доставки. Это не ноль (0 — это известное число) и не пустая строка ('' — это известная строка нулевой длины). NULL — именно отсутствие значения.

Почему = NULL не работает

Любое сравнение с NULL даёт не «истину» и не «ложь», а снова NULL (неизвестно). Поэтому условие WHERE phone = NULL не найдёт ничего. Убедимся:

SELECT NULL = NULL   AS sravnenie,
       NULL IS NULL  AS proverka,
       5 = NULL      AS pyat_ravno_null;

Вывод:

|1|

Первый и третий столбцы пусты — это NULL (результат неизвестен). Только средний столбец вернул 1 (истину), потому что использовал правильный оператор IS NULL.

IS NULL и IS NOT NULL

Для проверки на пустоту есть специальные операторы: IS NULL (значение отсутствует) и IS NOT NULL (значение есть). Найдём пользователей без телефона:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, phone TEXT);

INSERT INTO users (name, phone) VALUES
    ('Аня', '+7900'), ('Борис', NULL),
    ('Вера', NULL),   ('Глеб', '+7901');

SELECT name FROM users WHERE phone IS NULL;

Вывод:

Борис
Вера

COALESCE — значение по умолчанию

Часто вместо пустоты хочется показать заглушку. Функция COALESCE(a, b, ...) возвращает первый аргумент, который не NULL. Подставим текст вместо отсутствующего телефона:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, phone TEXT);

INSERT INTO users (name, phone) VALUES
    ('Аня', '+7900'), ('Борис', NULL);

SELECT name, COALESCE(phone, 'нет телефона') AS contact
FROM users;

Вывод:

Аня|+7900
Борис|нет телефона

NULL в сортировке и подсчёте

Полезно помнить пару правил: при ORDER BY в SQLite значения NULL идут первыми (считаются «меньше» всего). А агрегатная функция COUNT(столбец) не считает строки, где этот столбец NULL, тогда как COUNT(*) считает все строки. К агрегатам мы вернёмся в отдельном разделе.

Итог

  • NULL — это «значение отсутствует», а не ноль и не пустая строка.
  • Сравнение с NULL через = всегда даёт NULL; для проверки используйте IS NULL / IS NOT NULL.
  • COALESCE(a, b) подставляет запасное значение вместо NULL.
Проверьте себя
1. Что вернёт условие WHERE phone = NULL?
AВсе строки с пустым телефоном
BНичего — сравнение с NULL всегда даёт NULL, а не истину
CОшибку синтаксиса
DВсе строки таблицы
2. Чем NULL отличается от числа 0 и пустой строки ''?
AНичем, это синонимы
BNULL — это отсутствие значения, а 0 и '' — известные значения
CNULL больше нуля
DNULL можно хранить только в TEXT
3. Что вернёт COALESCE(NULL, 'нет телефона')?
ANULL
Bпустую строку
C'нет телефона'
Dошибку
Поддержать проект