Что такое NULL и как его учитывать в анализе?
В SQL и в анализе данных в целом NULL — это специальное значение, которое обозначает отсутствие данных, неизвестное значение или незаполненное поле. Оно не является ни нулём, ни пустой строкой, ни значением по умолчанию. NULL — это именно «ничто», и работа с ним требует особого подхода.
Что такое NULL
-
NULL — это не значение, а отсутствие значения.
-
Он может появляться:
-
При импорте данных с пропущенными ячейками.
-
Когда поле не было заполнено пользователем.
-
При ошибках ETL-процессов.
-
В результате вычислений, где хотя бы один из операндов NULL.
-
Примеры:
SELECT \* FROM users WHERE phone IS NULL;
Как работает NULL в SQL
Сравнение NULL с чем-либо через = или <> всегда даёт UNKNOWN:
SELECT \* FROM users WHERE phone = NULL; -- НИЧЕГО НЕ ВЕРНЁТ
-
Используйте специальные операторы:
-
IS NULL — проверка, что значение отсутствует.
-
IS NOT NULL — проверка, что значение присутствует.
-
Пример:
```python
SELECT * FROM orders WHERE delivery_date IS NULL;
2. В логических выражениях NULL ведёт себя как "неопределённость":
- TRUE AND NULL → NULL
- FALSE AND NULL → FALSE
- TRUE OR NULL → TRUE
- FALSE OR NULL → NULL
### **NULL и агрегатные функции**
Агрегатные функции в SQL обычно **игнорируют NULL**:
| **Функция** | **Что делает при NULL** |
| --- | --- |
| COUNT(\*) | Считает все строки, включая NULL |
| --- | --- |
| COUNT(column) | Считает только строки, где column НЕ NULL |
| --- | --- |
| SUM(column) | Суммирует только НЕ NULL значения |
| --- | --- |
| AVG(column) | Считает среднее по НЕ NULL значениям |
| --- | --- |
| MAX / MIN | Работают только по НЕ NULL |
| --- | --- |
Пример:
```python
SELECT
COUNT(\*) AS total_rows,
COUNT(salary) AS known_salaries,
AVG(salary) AS avg_salary
FROM employees;
Обработка NULL
- **Замена NULL значений:
**
COALESCE(expr1, expr2, ..., exprN) — возвращает первое НЕ NULL значение.
```python
SELECT COALESCE(phone, 'нет телефона') FROM users;
- - В PostgreSQL: NULLIF(a, b) возвращает NULL, если a = b.
1. **Фильтрация NULL:
**
Исключить строки с NULL:
<br/>```python
WHERE column IS NOT NULL
Оставить только строки с NULL:
```python
WHERE column IS NULL
### **NULL в аналитике и BI**
В аналитических задачах NULL — это один из критичных элементов, потому что:
- Он может _исказить метрики_: средние, суммы, медианы и др.
- Он может привести к _ошибкам при визуализации_: BI-инструменты не всегда отображают NULL как «отсутствие», и это может нарушать восприятие диаграмм.
- Часто требуется замена NULL на стандартные значения (например, 0, unknown, N/A) для отчетности.
**Примеры:**
- В Power BI BLANK() — это эквивалент NULL.
- В pandas (Python): None и np.nan — аналоги NULL.
### **NULL и соединения таблиц (JOIN)**
NULL может повлиять на результаты JOIN:
- При INNER JOIN строки с NULL в ключевых полях не соединяются.
- При LEFT JOIN строки с NULL остаются, но с пустыми значениями справа.
Пример:
```python
SELECT \*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
Если o.user_id — это NULL, то соответствия не будет, и поля из orders будут тоже NULL.
NULL в выражениях
В вычислениях NULL заражает результат:
SELECT price \* quantity AS total
FROM sales;
Если price или quantity равны NULL, то total тоже будет NULL.
Чтобы избежать этого:
SELECT COALESCE(price, 0) \* COALESCE(quantity, 0) AS total
FROM sales;
Подсчет количества NULL
Чтобы посчитать, сколько значений отсутствует:
SELECT COUNT(\*) - COUNT(column_name) AS null_count
FROM my_table;
Или:
SELECT COUNT(\*) FILTER (WHERE column IS NULL) AS nulls
FROM my_table;
(Второй вариант работает в PostgreSQL)
Причины появления NULL в данных
-
Ошибки пользователей.
-
Неполные данные при интеграции из разных источников.
-
Проблемы при загрузке CSV/Excel (пустые ячейки).
-
Условия в коде ETL, когда значение не вычисляется.
Стратегии обработки NULL
-
Игнорировать — если пропуски не мешают.
-
Удалять строки с NULL — если они редки и незначимы.
-
Заполнять (импутация):
-
Среднее/медиана (для чисел).
-
Мода (для категорий).
-
Специальные маркеры ('unknown', 'N/A', -1 и т.п.).
-
-
Предсказание значений — с помощью ML или статистики.
-
Создание фичи is_null — полезно в моделях.
Проверка наличия NULL в таблице
SELECT \*
FROM information_schema.columns
WHERE table_name = 'users' AND is_nullable = 'YES';
Это даст список столбцов, в которых возможны NULL значения (PostgreSQL и MySQL).
Особенности разных СУБД
СУБД | Особенности работы с NULL |
---|---|
PostgreSQL | Есть IS DISTINCT FROM, IS NOT DISTINCT FROM |
--- | --- |
MySQL | NULL сравнивается только через IS |
--- | --- |
SQL Server | Использует ISNULL() вместо COALESCE() |
--- | --- |
Oracle | Использует NVL() — аналог COALESCE |
--- | --- |
NULL — это не просто отсутствие значения, а полноценный элемент модели данных, который требует осознанного подхода при анализе, визуализации и обработке. Его игнорирование может привести к ложным выводам, неполной информации и даже ошибкам в бизнес-решениях.