ЛЕКЦІЯ 10

Магія Порожнечі! 🌌

Як приборкати NULL у SQL

Основи баз даних та спеціалізовані мови програмування

Ординський Олександр • викладач

ВТФК • Вінниця • 2025

2025

🎯 Наша мета сьогодні

  • 🔮 Зрозуміти фундаментальну концепцію NULL
  • 🪄 Опанувати закляття IS NULL для пошуку
  • ✨ Опанувати закляття COALESCE для заміни
  • 🛡️ Опанувати закляття NULLIF для захисту

🧠 Чари-розминка (1/2)

Питання: Яким закляттям (командою) ми відфільтруємо всіх студентів з факультету 'Gryffindor' (де house_id = 1)?

SELECT * FROM students WHERE ... ? ...;

🧠 Чари-розминка (2/2)

Питання: Як порахувати загальну кількість студентів у таблиці students?

SELECT ... ? ... FROM students;

🤷 Що таке NULL?

NULL

NULL — це не число 0 і не порожній рядок ''. NULL — це "НЕВІДОМЕ" або "ВІДСУТНЄ" значення. Це пустка, відсутність інформації в базі даних.

Аналогія: Концепція NULL: • NULL — це не 0 (Число "нуль") • NULL — це не '' (Порожній рядок) • NULL — це "НЕВІДОМЕ" або "ВІДСУТНЄ" значення • Це пустка

⚠️ Пастки NULL: "Отруйні" операції

NULL "отруює" (poisons) будь-які операції, в яких бере участь

-- Приклад 1: Арифметика 🧮
SELECT 100 + NULL AS result;
-- Результат: NULL

-- Приклад 2: З'єднання рядків 🔗
SELECT 'Luna' || ' ' || NULL AS full_name;
-- Результат: NULL

-- Приклад 3: Порівняння ⚖️
SELECT NULL = NULL AS comparison;
-- Результат: NULL (або FALSE)

🔴 Live Coding: Демонстрація пасток

$

Що будемо робити:

Action Items:

Готові? Почали кодити!

🪄 Закляття №1: IS NULL / IS NOT NULL

WHERE <колонка> IS NULL; WHERE <колонка> IS NOT NULL;
IS NULL
IS NOT NULL
IS NULL
IS NOT NULL

🎯 IS NULL: Які задачі вирішує?

Задача: Фільтрація та пошук на основі наявності або відсутності даних

-- Проблема, яку ми бачили:
SELECT * FROM students WHERE patronus = NULL;
-- Результат: (порожньо) — нічого не знаходить!

-- Рішення:
SELECT * FROM students WHERE patronus IS NULL;
-- Результат: знаходить Draco, Neville та інших

🟢 Live Coding: IS NULL в дії

$

Що будемо робити:

Action Items:

Готові? Почали кодити!

📝 Висновок по IS NULL

  • Головне правило: НІКОЛИ не використовуйте = або != для NULL
  • ЗАВЖДИ використовуйте IS NULL або IS NOT NULL
  • NULL = NULL завжди повертає FALSE (UNKNOWN)
  • IS NULL — це єдиний правильний спосіб знайти відсутні значення

✨ Закляття №2: COALESCE (Трансфігурація)

COALESCE

Це закляття-трансфігурація. Воно приймає список значень і повертає ПЕРШЕ НЕ-NULL значення зліва направо.

Аналогія: Синтаксис: COALESCE(value1, value2, default_value) Приклади: • COALESCE(NULL, NULL, 'Hedwig') → поверне 'Hedwig' • COALESCE('Ron', 'Harry') → поверне 'Ron' • COALESCE(NULL, 0, 100) → поверне 0

🎯 COALESCE: Які задачі вирішує? (1/3)

Задача 1: "Очищення" рядків для відображення

-- Проблема:
SELECT 'Luna' || ' ' || NULL AS full_name;
-- Результат: NULL

-- Рішення:
SELECT 'Luna' || ' ' || COALESCE(last_name, 'Unknown') AS full_name
FROM students
WHERE first_name = 'Luna';
-- Результат: 'Luna Unknown'

🎯 COALESCE: Які задачі вирішує? (2/3)

Задача 2: Безпечна арифметика

-- Проблема:
SELECT score + 10 FROM students WHERE first_name = 'Ginny';
-- Результат: NULL (для Ginny)

-- Рішення:
SELECT COALESCE(score, 0) + 10 AS new_score
FROM students
WHERE first_name = 'Ginny';
-- Результат: 10

🎯 COALESCE: Які задачі вирішує? (3/3)

AVG(score) — ігнорує NULL

AVG(COALESCE(score, 0)) — NULL = 0

🟢 Live Coding: COALESCE в дії

$

Що будемо робити:

Action Items:

Готові? Почали кодити!

📝 Висновок по COALESCE

  • Це ваше головне закляття для "очищення" даних
  • Воно замінює NULL на конкретне, безпечне значення
  • COALESCE приймає будь-яку кількість аргументів
  • Повертає перше НЕ-NULL значення зліва направо

🛡️ Закляття №3: NULLIF (Захисне)

NULLIF

Це зворотнє закляття. Якщо два значення рівні, воно повертає NULL. В іншому випадку, воно повертає перше значення.

Аналогія: Синтаксис: NULLIF(value1, value_to_check) Приклади: • NULLIF(10, 10) → поверне NULL • NULLIF(10, 5) → поверне 10 • NULLIF(0, 0) → поверне NULL (захист від ділення на нуль!)

🎯 NULLIF: Які задачі вирішує?

Задача: Запобігання помилці "ділення на нуль" (Divide by zero) 🛡️

-- Проблема:
-- SELECT 100 / 0;  --> ПОМИЛКА! 😱 (у більшості СУБД)

-- Рішення:
SELECT 100 / NULLIF(0, 0) AS result;
-- Результат: NULL (безпечно!)

-- Реальний приклад:
SELECT 
  course_name,
  SUM(sales) / NULLIF(SUM(clicks), 0) AS conversion_rate
FROM course_stats
GROUP BY course_name;

🟢 Live Coding: NULLIF в дії

$

Що будемо робити:

Action Items:

Готові? Почали кодити!

📝 Висновок по NULLIF

  • Використовуйте NULLIF, щоб перетворити "погане" конкретне значення на NULL
  • Найчастіший випадок: NULLIF(знаменник, 0) для захисту від ділення на нуль
  • Це закляття для запобігання помилкам
  • NULLIF — це зворотня операція до COALESCE

📜 Загальні Підсумки

  • NULL — це "невідомо", це не 0 і не порожній рядок
  • NULL "отруює" всі операції (+, ||, =)
  • IS NULL / IS NOT NULL — для ПОШУКУ
  • COALESCE — для ЗАМІНИ NULL на значення
  • NULLIF — для ПЕРЕТВОРЕННЯ значення на NULL (щоб уникнути помилок)

🦉 Перевірка знань!

Питання 1: Який запит знайде студентів БЕЗ прізвища (last_name = NULL)?

-- Варіант A:
SELECT * FROM students WHERE last_name = NULL;

-- Варіант B:
SELECT * FROM students WHERE last_name IS NULL;

-- Варіант C:
SELECT * FROM students WHERE COALESCE(last_name, '') = '';

🧹 Домашнє завдання

Наступна лекція:

Лекція 11: Агрегатні функції та GROUP BY

📚 Корисні ресурси:

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій