Як приборкати NULL у SQL
Основи баз даних та спеціалізовані мови програмування
Ординський Олександр • викладач
ВТФК • Вінниця • 2025
2025
Питання: Яким закляттям (командою) ми відфільтруємо всіх студентів з факультету 'Gryffindor' (де house_id = 1)?
SELECT * FROM students WHERE ... ? ...;Питання: Як порахувати загальну кількість студентів у таблиці students?
SELECT ... ? ... FROM students;NULL — це не число 0 і не порожній рядок ''. NULL — це "НЕВІДОМЕ" або "ВІДСУТНЄ" значення. Це пустка, відсутність інформації в базі даних.
Аналогія: Концепція NULL: • NULL — це не 0 (Число "нуль") • 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)Готові? Почали кодити!
WHERE<колонка>IS NULL; WHERE<колонка>IS NOT NULL;колонка>колонка>Задача: Фільтрація та пошук на основі наявності або відсутності даних
-- Проблема, яку ми бачили:
SELECT * FROM students WHERE patronus = NULL;
-- Результат: (порожньо) — нічого не знаходить!
-- Рішення:
SELECT * FROM students WHERE patronus IS NULL;
-- Результат: знаходить Draco, Neville та іншихГотові? Почали кодити!
Це закляття-трансфігурація. Воно приймає список значень і повертає ПЕРШЕ НЕ-NULL значення зліва направо.
Аналогія: Синтаксис: COALESCE(value1, value2, default_value) Приклади: • COALESCE(NULL, NULL, 'Hedwig') → поверне 'Hedwig' • COALESCE('Ron', 'Harry') → поверне 'Ron' • COALESCE(NULL, 0, 100) → поверне 0
Задача 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'Задача 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Готові? Почали кодити!
Це зворотнє закляття. Якщо два значення рівні, воно повертає NULL. В іншому випадку, воно повертає перше значення.
Аналогія: Синтаксис: NULLIF(value1, value_to_check) Приклади: • NULLIF(10, 10) → поверне NULL • NULLIF(10, 5) → поверне 10 • NULLIF(0, 0) → поверне NULL (захист від ділення на нуль!)
Задача: Запобігання помилці "ділення на нуль" (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;Готові? Почали кодити!
Питання 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
Дякую за увагу! 💾