ЛЕКЦІЯ 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

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

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

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

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

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