Пропущенные значения: NULL
С NULL вы знакомы с первого урока: он означает, что значение отсутствует. Магазин не знает город Ava Green, а у Robot Rebellion пока нет даты выхода. Чтобы найти такие строки, кажется естественным написать = NULL. Но этот запрос ничего не находит:
SELECT name, city
FROM customers
WHERE city = NULL;| name | city |
|---|
Это не ошибка в данных. NULL означает «неизвестно», а сравнение чего угодно с неизвестным значением даёт неизвестный результат. Равен ли London какому-то неизвестному городу? Никто не знает. Такое сравнение не истинно и не ложно — его результат снова NULL. А WHERE оставляет только те строки, для которых условие истинно. Даже NULL = NULL не истинно: одинаковы ли два неизвестных города? Снова неизвестно. Можете проверить сами: SELECT без FROM не читает никакую таблицу, он просто вычисляет записанные вами значения и показывает их в одной строке:
SELECT 5 = NULL, NULL = NULL;| 5 = NULL | NULL = NULL |
|---|---|
| NULL | NULL |
Поэтому для пропущенных значений в SQL есть особый оператор — IS NULL. Игры, которые ещё не вышли:
SELECT title, released
FROM games
WHERE released IS NULL
ORDER BY title;| title | released |
|---|---|
| Mystery Manor | NULL |
| Robot Rebellion | NULL |
Противоположный ему — IS NOT NULL, строки, в которых значение есть: WHERE released IS NOT NULL находит 18 вышедших игр.
То же верно для любого другого сравнения, включая <>. Какие покупатели не из London?
SELECT name, city
FROM customers
WHERE city <> 'London'
ORDER BY name;| name | city |
|---|---|
| Isla Young | Leeds |
| Jack Harris | Manchester |
| Liam Turner | Manchester |
| … | … |
Ava Green и Henry Scott в результате нет. Отличается ли неизвестный город от London? Снова неизвестно. Если нужны и они, об этом нужно попросить: city <> 'London' OR city IS NULL.
Типичная ошибка: = NULL вместо IS NULL. Это не ошибка для SQLite, и он не предупредит; запрос просто ничего не найдёт. Если ищете пропущенные значения, всегда пишите IS NULL.
Задание
- 1
Запрос в редакторе должен показывать имя и email покупателей, у которых нет города, но он ничего не находит. Исправьте его:
name email Ava Green ava.green@mail.com Henry Scott henry@scott.dev - 2
Ниже покажите ID игры, количество звёзд и комментарий в пятизвёздочных отзывах, у которых есть комментарий, отсортировав по ID игры:
game_id stars comment 1 5 Best RPG I have played in years! 3 5 So relaxing. 6 5 Perfect for the bus. 7 5 Amazing space battles. 14 5 Fast and fun. 15 5 Worth every penny. - 3
Магазин пишет рассылку о новых играх: вышедших в 2025 году или позже и тех, что ещё не вышли. Покажите их название и дату выхода, отсортировав по дате выхода, а затем по названию:
title released Mystery Manor NULL Robot Rebellion NULL Star Pilots 2025-01-23 Turbo Karts 2025-06-05 Goal Rush 2025-09-26 Knight's Oath 2025-11-14