BETWEEN, IN, LIKE и IS NULL
Удобные операторы отбора
Те же условия можно записывать короче и выразительнее специальными операторами.
BETWEEN — диапазон «от и до»
x BETWEEN a AND b — то же самое, что x >= a AND x <= b. Обе границы включаются:
SELECT airplane_code, range
FROM airplanes
WHERE range BETWEEN 6000 AND 8000; -- от 6000 до 8000 включительно
IN — «один из списка»
x IN (...) истинно, если x совпадает с любым значением из списка. Заменяет цепочку OR:
SELECT airplane_code, model
FROM airplanes
WHERE airplane_code IN ('351', '77W', '789');
LIKE — поиск по шаблону текста
LIKE сравнивает текст с шаблоном, где есть два спецсимвола:
%— любое количество любых символов (в том числе ноль);_— ровно один любой символ.
WHERE model LIKE 'Boeing%' -- начинается со слова Boeing
WHERE model LIKE '%neo%' -- содержит «neo» где угодно
WHERE airport_code LIKE 'A__'-- три буквы, первая A
LIKE чувствителен к регистру. В PostgreSQL есть удобный ILIKE — то же самое, но без учёта регистра ('%NEO%' найдёт и «neo», и «Neo»).
NULL — «значение неизвестно»
В базе встречается особое значение NULL — это не ноль и не пустая строка, а «значение отсутствует / неизвестно». Например, actual_departure равно NULL, если фактическое время вылета не зафиксировано. Это может быть будущий, задержанный или отменённый рейс, поэтому для точного бизнес-вывода обычно дополнительно проверяют status.
Главная ловушка: с NULL нельзя сравнивать через =. Выражение actual_departure = NULL не истинно и не ложно — оно само даёт «неизвестно», и строка не попадёт в результат. Правильно — операторы IS NULL и IS NOT NULL:
SELECT flight_id, status
FROM flights
WHERE actual_departure IS NULL; -- фактическое время вылета отсутствует
Типичные ошибки
- Перепутанные границы BETWEEN.
BETWEEN 8000 AND 6000не вызовет ошибку, но и ничего не найдёт: сначала пишется меньшая граница, потом большая. - Сравнение с NULL через «=».
actual_departure = NULLникогда не бывает истинным, даже для пустых значений. ТолькоIS NULLиIS NOT NULL. - LIKE различает регистр.
model LIKE '%NEO%'не найдётneo. Для поиска без учёта регистра в PostgreSQL естьILIKE. - % и _.
%— любое количество любых символов, в том числе ноль._— ровно один символ. Шаблон'A__'найдёт трёхбуквенные коды на A, а'A%'— любые строки на A.
💡 Запомните: проверка на «пусто» — этоIS NULL/IS NOT NULL, а не= NULL.
Практика
9- Тест 1 — Что вернёт условие «WHERE range BETWEEN 8000 AND 6000»?
- Тест 2 — Как найти рейсы без фактического времени вылета?
- Задача 1 — Диапазон дальности (BETWEEN)
- Задача 2 — Несколько кодов (IN)
- Задача 3 — Только Boeing (LIKE)
- Задача 4 — Поиск по части слова (ILIKE)
- Задача 5 — Рейсы без фактического времени вылета (IS NULL)
- Задача 6 — Коды на букву A (шаблон _)
- Задача 7 — Boeing средней дальности
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.
Потренируйтесь в тренажёре
3Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.