Что такое 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; -- НИЧЕГО НЕ ВЕРНЁТ  
  1. Используйте специальные операторы:

    • 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

  1. **Замена 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

  1. Игнорировать — если пропуски не мешают.

  2. Удалять строки с NULL — если они редки и незначимы.

  3. Заполнять (импутация):

    • Среднее/медиана (для чисел).

    • Мода (для категорий).

    • Специальные маркеры ('unknown', 'N/A', -1 и т.п.).

  4. Предсказание значений — с помощью ML или статистики.

  5. Создание фичи 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 — это не просто отсутствие значения, а полноценный элемент модели данных, который требует осознанного подхода при анализе, визуализации и обработке. Его игнорирование может привести к ложным выводам, неполной информации и даже ошибкам в бизнес-решениях.