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 ≠ 0
  • NULL ≠ ''
  • NULL ≠ FALSE
  • NULL ≠ '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