УРОК 7 / 27· ≈ 35 мин

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. Тест 1 — Что вернёт условие «WHERE range BETWEEN 8000 AND 6000»?
  2. Тест 2 — Как найти рейсы без фактического времени вылета?
  3. Задача 1 — Диапазон дальности (BETWEEN)
  4. Задача 2 — Несколько кодов (IN)
  5. Задача 3 — Только Boeing (LIKE)
  6. Задача 4 — Поиск по части слова (ILIKE)
  7. Задача 5 — Рейсы без фактического времени вылета (IS NULL)
  8. Задача 6 — Коды на букву A (шаблон _)
  9. Задача 7 — Boeing средней дальности

Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.

Зарегистрироваться и решитьВойти

Потренируйтесь в тренажёре

3

Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.

WHERE и условия: сравнение, AND, OR, NOTСледующий урок: Агрегатные функции и GROUP BY