NULL — тихий саботаж в твоей БД

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,621
Реакции
1,555
Credits
33,871
NULL — тихий саботаж в твоей БД
На первый взгляд, NULL — просто отсутствие значения. Но на практике это частый источник багов, неверных аналитик и проблем в бизнес-логике.

Антипаттерн: беспечное обращение с NULL
Примеры:
SQL:
SELECT * FROM users WHERE age > 18;  -- Пользователи с age = NULL не попадут
Ты думаешь, что отбираешь всех взрослых, но age = NULL тут "выпадает", ведь NULL > 18 → UNKNOWN.
SQL:
WHERE col1 = col2  -- Не сработает, если хотя бы одно значение NULL
Проблема: NULL не равно даже самому себе (NULL != NULL).
Итоги: ошибки в JOIN'ах, WHERE-фильтрах, расчетах.

Как защититься:

1. Явно учитывай NULL:
SQL:
WHERE age > 18 OR age IS NULL  -- если хочешь включить "неизвестный возраст"
2. Используй COALESCE:
SQL:
SELECT COALESCE(discount, 0) FROM orders  -- подставим 0, если скидка не указана
3. Проверяй NULL через IS NULL / IS NOT NULL
4. Для агрегаций учитывай поведение NULL:
SQL:
AVG(column)  -- пропустит NULL'ы, но COUNT(column) тоже не посчитает их!
Вывод:
NULL — не "ничего", а "неизвестно".
Пиши запросы так, как будто NULL всегда где-то прячется — и он не на твоей стороне.