Сегодня мы продолжим изучение работы с 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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ