Что такое NULL и как с ним работать в SQL?

В SQL NULL — это специальное значение, обозначающее отсутствие значения или неизвестное значение в ячейке таблицы. Оно не равно ни нулю (0), ни пустой строке (''), ни другим числовым, текстовым или логическим значениям. Концептуально NULL указывает на то, что данных в этом месте просто нет.

Что такое NULL?

  • NULL означает, что значение не определено или не задано.

  • Оно может встречаться в любых типах данных — INT, VARCHAR, DATE, BOOLEAN и т. д.

  • В базе данных столбец может быть настроен как NULL или NOT NULL.

  • NULL не участвует в обычных арифметических и логических операциях, как обычные значения.

Примеры появления NULL

При вставке записи, если значение не указано, а столбец допускает NULL:

```python
INSERT INTO Employees (Name, Department)
VALUES ('Alice', NULL);

При внешнем соединении (LEFT JOIN), когда нет соответствующей строки:  
<br/>```python  
SELECT c.Name, o.OrderID
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;  
  1. Если у клиента нет заказов, OrderID будет NULL.

Сравнение с NULL: IS NULL и IS NOT NULL

В SQL нельзя использовать = NULL или <> NULL, потому что NULL не является значением в традиционном смысле.

Неправильно:

WHERE column = NULL

Правильно:

WHERE column IS NULL

Аналогично:

WHERE column IS NOT NULL

Работа с NULL в выражениях и функциях

Агрегатные функции

Агрегатные функции игнорируют NULL, если не указано иное:

SELECT COUNT(*) -- считает все строки

SELECT COUNT(col) -- не считает строки с NULL в col

COALESCE

Функция COALESCE() возвращает первое не-NULL значение из переданного списка:

SELECT COALESCE(MiddleName, '—') AS DisplayName
FROM Employees;

Если MiddleName — NULL, будет выведено '—'.

ISNULL / IFNULL

Альтернатива COALESCE — специфические функции для разных СУБД:

  • ISNULL(expr, replacement) — в SQL Server

  • IFNULL(expr, replacement) — в MySQL

  • NVL(expr, replacement) — в Oracle

Пример:

SELECT ISNULL(Bonus, 0) FROM Salaries;

Логические выражения с NULL

Любое логическое выражение, в котором участвует NULL, становится неопределённым (UNKNOWN), если не обрабатывается явно.

Пример:

SELECT \*
FROM Employees
WHERE Salary > NULL; --  всегда FALSE

Для корректной проверки:

WHERE Salary IS NULL

NULL и CASE выражения

Оператор CASE позволяет обрабатывать NULL явно:

SELECT
Name,
CASE
WHEN MiddleName IS NULL THEN 'Нет отчества'
ELSE MiddleName
END AS Middle
FROM Employees;

NULL в ORDER BY

  • По умолчанию NULL сортируется после всех значений (в большинстве СУБД).

  • Можно управлять этим явно:

ORDER BY column ASC NULLS FIRST
ORDER BY column DESC NULLS LAST

Поддержка зависит от СУБД (PostgreSQL поддерживает явно, MySQL не всегда).

NULL в GROUP BY

  • GROUP BY считает NULL значением группы, как и остальные:
SELECT Department, COUNT(\*)
FROM Employees
GROUP BY Department;

Если есть сотрудники с NULL в Department, они попадут в отдельную группу.

NULL в индексации

  • Поведение NULL в индексах зависит от СУБД.

  • Например, в PostgreSQL и SQL Server NULL может быть включён в индекс.

  • В MySQL UNIQUE индекс допускает несколько NULL, так как NULL <> NULL.

Проблемы и типичные ошибки при работе с NULL

Ошибка сравнения:

```python
WHERE column = NULL -- ❌

**Арифметика с NULL:  
<br/>**```python  
SELECT 100 + NULL -- результат: NULL  

Условие фильтрации:

```python
SELECT * FROM table WHERE column <> 'value'

1.   Строки с NULL в column не попадут в результат, потому что NULL <> 'value'  UNKNOWN.  


**Ожидание "пустого значения", но получаем NULL:  
<br/>**```python  
WHERE column = '' -- не находит NULL  

Когда использовать NULL

  • Когда данные реально неизвестны или **ещё не заданы
    **
  • Когда значение в будущем будет добавлено (например, бонус, отчество, оценка)

  • В правом JOIN, если связь отсутствует

Альтернатива NULL

Некоторые предпочитают использовать специальные коды (например, 'N/A', 0, -1), но это может привести к:

  • нарушению типизации (N/A в числовом поле)

  • логическим ошибкам в расчётах

  • потере гибкости в аналитике и агрегациях

Поэтому использование именно NULL в большинстве случаев считается корректным.

NULL — важная и часто недооценённая часть SQL. Он требует аккуратного обращения, чёткого понимания логики и правильного использования в условиях, фильтрах, агрегациях и объединениях таблиц.