УРОК 18 / 27· ≈ 25 мин

UNION, EXISTS и NOT EXISTS

UNION — склеить результаты двух запросов

UNION ставит результаты двух запросов друг под другом. Например, все аэропорты, которые встречаются в маршрутах — и как пункт вылета, и как пункт прилёта:

SELECT departure_airport AS airport FROM routes
UNION
SELECT arrival_airport FROM routes
ORDER BY airport;
  • UNION убирает повторы, UNION ALL — оставляет все строки (и работает быстрее, потому что не ищет дубли);
  • в обоих запросах должно быть одинаковое число столбцов совместимых типов, а имена столбцов берутся из первого запроса;
  • ORDER BY пишется один раз — в самом конце.

EXISTS — «есть ли хоть одна такая строка»

EXISTS (подзапрос) истинно, если подзапрос вернул хотя бы одну строку. Подзапрос обычно связан с внешним запросом: он ссылается на столбцы его текущей строки.

SELECT a.airport_code, a.city
FROM airports a
WHERE EXISTS (
  SELECT 1 FROM routes r WHERE r.departure_airport = a.airport_code
);

Читается как «аэропорты, для которых существует маршрут с вылетом из них». Что именно выбирает подзапрос, неважно — поэтому пишут SELECT 1.

NOT EXISTS вместо NOT IN

NOT EXISTS находит строки, для которых пары нет. В отличие от NOT IN, он правильно работает, даже если в подзапросе встречаются NULL, — поэтому для поиска «тех, у кого нет…» его используют чаще.

Типичные ошибки

  • UNION вместо UNION ALL при подсчёте. Если нужно посчитать все упоминания, UNION выбросит повторы, и число окажется меньше.
  • Подзапрос в EXISTS без связи с внешним. WHERE EXISTS (SELECT 1 FROM routes) истинно для всех строк сразу — условие ничего не фильтрует.
  • Разное число столбцов в UNION. База вернёт ошибку: каждой строке результата нужны одни и те же столбцы.

Практика

7
  1. Тест 1 — Чем UNION отличается от UNION ALL?
  2. Тест 2 — Подзапрос в NOT IN (…) может вернуть NULL. Что надёжнее использовать для поиска «тех, у кого нет пары»?
  3. Задача 1 — Все аэропорты маршрутов (UNION)
  4. Задача 2 — Сколько всего упоминаний (UNION ALL)
  5. Задача 3 — Аэропорты с вылетами (EXISTS)
  6. Задача 4 — Аэропорты без прилётов (NOT EXISTS)
  7. Задача 5 — Билеты с перелётом бизнес-классом

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

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

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

1

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

Общие табличные выражения (WITH / CTE)Следующий урок: Оконные функции: основы