Оператор IS NULL: работа с пустыми значениями
Что такое NULL и почему он особенный?
NULL в SQL — это не просто пустое значение или ноль. Это специальный маркер, который говорит: «Здесь нет данных, и мы не знаем, что должно быть».
🔹 NULL ≠ 0 (ноль — это конкретное число)
🔹 NULL ≠ '' (пустая строка — это всё же строка)
🔹 NULL ≠ FALSE (логическое значение — это тоже информация)
-- Пример различий:
SELECT
NULL = 0, -- Результат: NULL (неизвестно)
NULL = '', -- Результат: NULL
NULL IS NULL; -- Результат: TRUE (единственный верный способ проверить)
Почему = не работает с NULL? 🤔
Оператор = сравнивает известные значения. NULL — это неизвестность, поэтому обычные сравнения всегда возвращают NULL (что в условиях WHERE трактуется как FALSE).
-- Неправильный подход:
SELECT * FROM employees WHERE salary = NULL; -- Не вернёт строки, даже если salary NULL!
-- Правильный подход:
SELECT * FROM employees WHERE salary IS NULL; -- Вернёт строки с NULL в salary
IS NULL и IS NOT NULL в действии 💼
Рассмотрим таблицу orders с заказами, где некоторые даты доставки (delivery_date) не указаны:
-- Найти не доставленные заказы:
SELECT order_id, customer_id
FROM orders
WHERE delivery_date IS NULL;
-- Найти доставленные или ожидающие доставки заказы:
SELECT order_id, customer_id
FROM orders
WHERE delivery_date IS NOT NULL;
NULL в агрегатных функциях 📊
NULL игнорируется в большинстве агрегатных функций, что может влиять на расчёты:
-- Средний балл студентов (NULL-значения не учитываются):
SELECT AVG(score) FROM students;
-- Количество студентов с указанным баллом:
SELECT COUNT(score) FROM students;
-- Общее количество студентов (включая NULL):
SELECT COUNT(*) FROM students;
Опасности NULL в условиях
NULL может «ломать» логику условий. Например, при проверке диапазонов:
-- Найти продукты с ценой вне диапазона 10–100:
SELECT product_name
FROM products
WHERE price < 10 OR price > 100; -- Пропустит строки, где price IS NULL!
Решение — явно обрабатывать NULL:
SELECT product_name
FROM products
WHERE price < 10 OR price > 100 OR price IS NULL;
COALESCE и NULLIF — ваши инструменты 🔧
Эти функции помогают работать с NULL:
-- Заменить NULL на 0 в отчёте:
SELECT product_name, COALESCE(stock_quantity, 0) AS stock
FROM products;
-- Обнулить устаревшие цены:
UPDATE products
SET price = NULLIF(price, 0) -- Если price = 0, вернёт NULL
WHERE discontinued = TRUE;
Практический кейс: анализ базы данных 📈
Допустим, у нас есть таблица clients с пропущенными данными:
-- Найти клиентов без email и телефона (полная потеря связи):
SELECT client_name
FROM clients
WHERE email IS NULL AND phone IS NULL;
-- Рассчитать процент «молчащих» клиентов:
SELECT
100.0 * COUNT(CASE WHEN email IS NULL AND phone IS NULL THEN 1 END) / COUNT(*)
FROM clients;
Итоговые рекомендации от Данилы Бежина 🎯
- Всегда используйте
IS NULL/IS NOT NULLдля проверки NULL-значений. - Учитывайте влияние NULL на агрегатные функции и условия WHERE.
- Документируйте поля, которые могут содержать NULL — это сэкономит часы отладки!
- Для углублённого изучения SQL подписывайтесь на YouTube-канал Данилы Бежина.
-- Финальный пример: чистка данных перед анализом
UPDATE survey_results
SET response = NULL
WHERE response = 'N/A' OR response = '';
Теперь вы вооружены знаниями для битвы с NULL-значениями! ️⚔️