Что такое 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;
- Если у клиента нет заказов, 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. Он требует аккуратного обращения, чёткого понимания логики и правильного использования в условиях, фильтрах, агрегациях и объединениях таблиц.