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