NULL - одна из самых важных и одновременно самых часто неправильно понимаемых концепций в SQL. На первый взгляд может показаться, что NULL - это просто пустое значение. Но это не совсем так.
NULL означает отсутствие известного значения. Это принципиально отличается от 0, пустой строки '' или FALSE.
Представим таблицу пользователей:
CREATE TABLE users (
id INT,
name VARCHAR(100),
phone VARCHAR(20)
);
У одного пользователя номер телефона может быть неизвестен:
id | name | phone ---+-------+-------- 1 | Alice | +123456 2 | Bob | NULL
Для Bob мы не знаем номер телефона. Поэтому в phone хранится NULL.
Важно понимать:
Это именно отсутствие значения.
Почему нельзя сравнивать NULL через =
Одна из самых распространённых ошибок:
SELECT * FROM users WHERE phone = NULL;
Такой запрос не найдёт пользователей с NULL.
Причина заключается в том, что SQL использует трёхзначную логику. Результатом сравнения может быть не только TRUE или FALSE, но и UNKNOWN.
Например: NULL = NULL не является TRUE. Результат - UNKNOWN.
Поэтому для проверки NULL используются специальные операторы:
SELECT * FROM users WHERE phone IS NULL;
А для проверки отсутствия NULL:
SELECT * FROM users WHERE phone IS NOT NULL;
Трёхзначная логика
В обычной логике есть два значения:
TRUE FALSE
В SQL появляется третье:
UNKNOWN
Например:
SELECT 10 = 10; -- TRUE SELECT 10 = 20; -- FALSE SELECT 10 = NULL; -- UNKNOWN
Это особенно важно при использовании WHERE.
WHERE выбирает только строки, для которых условие имеет значение TRUE. Строки с результатом FALSE или UNKNOWN отбрасываются.
Например:
SELECT * FROM users WHERE phone <> '+123456';
Пользователь с phone = NULL не попадёт в результат. У SQL нет информации, чтобы утверждать, что NULL действительно отличается от '+123456'.
Как получить значение вместо NULL?
Иногда нам нужно заменить NULL каким-либо значением. Для этого часто используется COALESCE:
SELECT name, COALESCE(phone, 'Не указан') AS phone FROM users;
COALESCE возвращает первое значение, которое не является NULL.
Например:
SELECT COALESCE(NULL, NULL, 'hello', 'world');
Результат: hello
NULL - это не всегда ошибка
Наличие NULL в базе данных не обязательно означает проблему. Иногда отсутствие значения - это полноценное состояние данных.
Например:
NULL - это не "пустая строка" и не "нулевое значение". Это специальное состояние, означающее отсутствие известного значения.
Source: Orkhan Alishov's notes