Оператор 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;

Итоговые рекомендации от Данилы Бежина 🎯

  1. Всегда используйте IS NULL/IS NOT NULL для проверки NULL-значений.
  2. Учитывайте влияние NULL на агрегатные функции и условия WHERE.
  3. Документируйте поля, которые могут содержать NULL — это сэкономит часы отладки!
  4. Для углублённого изучения SQL подписывайтесь на YouTube-канал Данилы Бежина.
-- Финальный пример: чистка данных перед анализом
UPDATE survey_results 
SET response = NULL 
WHERE response = 'N/A' OR response = '';

Теперь вы вооружены знаниями для битвы с NULL-значениями! ️⚔️

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео