Сьогодні ми продовжимо вивчати роботу з NULL — невидимим героєм баз даних. Якщо ти досі думаєш, що NULL — це просто "нічого", то ти правий, але не зовсім. У цій лекції ми навчимося перевіряти, чи є в наших даних NULL, і що з цим робити. Ну що, готовий вистежувати відсутність значень?
Давай почнемо з простого — уяви, що ти працюєш з базою даних інтернет-магазину. У тебе є таблиця замовлень, де для деяких замовлень інформацію про коментарі не додали, а в інших — вказали примітки. Якщо ти захочеш знайти всі замовлення з порожніми примітками, але застосуєш звичайні порівняння =, <>, ти здивуєшся... Чому? Бо NULL — це особливий випадок!
У SQL перевірки на наявність або відсутність NULL виконуються за допомогою IS NULL та IS NOT NULL. Ці оператори допомагають нам розібратися з NULL і отримати потрібні дані.
Перевірка значень з IS NULL
IS NULL використовується для перевірки, чи містить стовпець або вираз значення NULL.
SELECT *
FROM orders
WHERE comment IS NULL;
Цей запит поверне всі рядки, де значення у стовпці comment дорівнює NULL. Це зручно, якщо ти хочеш знайти замовлення, де відсутні примітки.
Ось приклад таблиці orders:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Термінова доставка" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Запит:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
Результат:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
Зверни увагу, що рядки з порожнім рядком '' сюди не включені, бо '' — це не NULL.
Перевірка значень з IS NOT NULL
IS NOT NULL працює у протилежному напрямку; він перевіряє, чи значення не NULL. Наприклад, якщо ти хочеш отримати всі замовлення з вказаними коментарями:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
Цей запит поверне тільки рядки, де у стовпці comment є дані (включаючи порожні рядки '').
Приклад
Таблиця orders залишається такою ж.
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Термінова доставка" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Виконаємо запит:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Результат:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "Термінова доставка" |
| 3 | Alex Lin | '' |
Зверни увагу, що рядок з порожнім рядком '' включений. SQL вважає це значення "непорожнім".
Коли використовувати IS NULL та IS NOT NULL?
Ось кілька сценаріїв:
- Фільтрація даних: ти хочеш виключити неповні записи, де значення відсутні.
- Обробка помилок: іноді
NULLможе означати помилку введення даних, і тобі потрібно ізолювати такі рядки. - Аналіз даних: підрахунок кількості записів з відсутніми значеннями допомагає зрозуміти якість даних.
Практичне застосування
Спробуємо кілька практичних задач:
Задача 1: Вибір студентів без вказаної дати народження
Припустимо, у тебе є таблиця students:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
Запит:
SELECT name
FROM students
WHERE birth_date IS NULL;
Результат:
| name |
|---|
| Maria Chi |
| Anna Song |
Цей запит корисний для пошуку студентів, у яких треба уточнити дату народження.
Задача 2: Вибір замовлень з коментарями
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Термінова доставка" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Для таблиці orders ми можемо знайти замовлення з заповненими коментарями:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Результат:
| customer_name | comment |
|---|---|
| Otto Art | "Термінова доставка" |
| Alex Lin | '' |
Порівняння зі звичайними операторами
Тепер давай зробимо крок убік і спробуємо виконати "помилковий" запит для перевірки NULL:
SELECT *
FROM orders
WHERE comment = NULL;
Здивований? Запит не поверне жодного рядка, навіть тих, де comment явно містить NULL. Це тому, що NULL не можна порівнювати за допомогою стандартних операторів. Для таких порівнянь ми зобов'язані використовувати IS NULL.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ