UNION ALL в SQL: объединение результатов запросов
UNION ALL объединяет результаты нескольких SELECT и сохраняет повторяющиеся строки. Разберём, чем он отличается от UNION SQL, какие требования есть к колонкам и где ставить ORDER BY.
Обновлено · Команда SQL Arena
Что потренируете
- Объединять результаты нескольких SELECT через UNION
- Выбирать между UNION и UNION ALL
- Следить за количеством и типами колонок
- Находить общие строки через INTERSECT
- Исключать один набор из другого через EXCEPT
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В таблице ticket_events записаны действия сотрудников поддержки. Выведите пары agent_id и source для агентов, у которых были события resolved или escalated. Для resolved укажите строку resolved, для escalated — escalated. Объедините результаты через UNION и отсортируйте по agent_id, затем по source.
SELECT agent_id, 'resolved' AS source FROM ticket_events WHERE event_type = 'resolved' UNION SELECT agent_id, 'escalated' AS source FROM ticket_events WHERE event_type = 'escalated' ORDER BY agent_id, source;
| # | agent_id | source |
|---|---|---|
| 1 | 1 | escalated |
| 2 | 1 | resolved |
| 3 | 2 | escalated |
| 4 | 3 | escalated |
В таблице ticket_events записаны действия сотрудников поддержки. Выведите пары agent_id и source для агентов, у которых были события resolved или escalated. Для resolved укажите строку resolved, для escalated — escalated. Объедините результаты через UNION и отсортируйте по agent_id, затем по source.
SELECT agent_id, 'resolved' AS source FROM ticket_events WHERE event_type = 'resolved' UNION SELECT agent_id, 'escalated' AS source FROM ticket_events WHERE event_type = 'escalated' ORDER BY agent_id, source;
Как работает UNION ALL и UNION SQL
Первая часть запроса выбирает события resolved. Из каждой подходящей строки берётся agent_id, а второй колонкой создаётся константа 'resolved'. Получается набор одинаковой структуры: идентификатор агента и название источника строки. Это важно: UNION сопоставляет колонки по позиции, поэтому обе части должны возвращать одинаковое количество колонок с совместимыми типами.
Вторая часть строится так же, но отбирает escalated. После UNION PostgreSQL складывает результаты двух SELECT и удаляет полностью совпадающие строки. Дубликатом считается вся строка целиком, а не только agent_id. Поэтому агент 1 остаётся в результате дважды: одна строка содержит resolved, другая escalated. Если бы обе части вернули пару 1, resolved, UNION оставил бы только один экземпляр.
ORDER BY стоит один раз после всей конструкции. Он сортирует уже объединённый результат, а не отдельную половину запроса. В реальном отчёте это позволяет собрать строки из нескольких источников в общий формат и затем применить единое упорядочивание. Если дубли допустимы или имеют смысл, вместо UNION обычно нужен UNION ALL: он не запускает удаление повторов и сохраняет каждую строку.
UNION ALL и UNION решают одну задачу — соединяют строки из нескольких совместимых SELECT вертикально. Разница в обработке повторов: UNION удаляет полностью совпадающие строки результата, а UNION ALL оставляет их как есть. В каждой части должно быть одинаковое количество колонок, а значения в соответствующих позициях должны иметь совместимые типы. Имена результирующих колонок обычно определяются первой частью запроса. Если итог нужно отсортировать, общий ORDER BY ставят после последнего SELECT, а не между частями объединения.
SELECT agent_id, 'resolved' AS source FROM ticket_events WHERE event_type = 'resolved' UNION SELECT agent_id, 'escalated' AS source FROM ticket_events WHERE event_type = 'escalated' ORDER BY agent_id, source;
| agent_id | source |
|---|---|
| 1 | escalated |
| 1 | resolved |
| 2 | escalated |
| 3 | escalated |
| 3 | resolved |
| 4 | escalated |
| 5 | escalated |
| 5 | resolved |
Ошибки при использовании UNION и UNION ALL
Использовать UNION, когда повторы нужно сохранить
UNION удаляет одинаковые строки после объединения выборок. Если каждая исходная запись важна сама по себе, например это отдельное событие или продажа, часть данных исчезнет. В таком случае нужен UNION ALL.
Объединять SELECT с разной структурой
У частей UNION должно совпадать количество колонок, а типы на одинаковых позициях должны быть совместимы. Нельзя без подготовки объединить запрос из двух колонок с запросом из трёх или поставить дату напротив значения несовместимого типа.
Считать, что UNION удаляет дубли только по одной колонке
Сравнивается вся результирующая строка. Два одинаковых agent_id не считаются дублем, если остальные значения различаются. Если нужна уникальность только по конкретному полю, задачу приходится формулировать иначе.
Задачи по теме в тренажёре
Курс «SQL с нуля»После базового примера полезно перейти к задачам, где операции над множествами решают разные практические случаи. В SQL Arena есть бесплатные задачи на сбор списка статусов без повторов, объединение нескольких частей реестра и просмотренных объектов. На более сложных уровнях UNION и связанные приёмы встречаются внутри преобразования данных, расчётов по периодам и запросов, где к одному результату ведут несколько независимых путей. Это помогает увидеть важную границу: UNION нужен не для соединения колонок разных таблиц, а для складывания строк совместимой структуры. Для системного продолжения можно перейти в курс «SQL с нуля»: там теория разбирается вместе с задачами в уроках.
- EasyбесплатноВсе статусы заказов и подписок без дублейpostgresqlclickhouse
- EasyбесплатноЕдиный реестр плеч доставкиpostgresql
- EasyбесплатноЧто посмотрели, без повторовpostgresql
- MediumPremiumГистограмма длительности сессийpostgresqlmysqlclickhouse
- HardPremiumНепрерывные периоды успешных и неуспешных днейpostgresqlmysqlclickhouse
- MediumPremiumРазвернуть цены товаров по магазинамpostgresqlmysqlclickhouse
- HardPremiumГодовые продажи товаров с учётом периодов активностиpostgresqlmysqlclickhouse
- MediumPremiumДва независимых пути к заказамpostgresql
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Что такое UNION ALL в SQL?
UNION ALL объединяет строки, возвращённые несколькими SELECT, в один результат и не удаляет дубликаты. Части запроса должны возвращать одинаковое количество колонок с совместимыми типами.
Чем UNION отличается от UNION ALL?
UNION удаляет полностью совпадающие строки после объединения результатов. UNION ALL сохраняет все строки, включая повторы, поэтому его выбирают, когда дедупликация не нужна.
Как работает UNION SQL?
SQL UNION выполняет несколько SELECT и складывает их результаты друг под другом. Сопоставление колонок происходит по позиции, а не по имени.
Можно ли использовать ORDER BY с UNION ALL?
Да. Если нужно отсортировать весь объединённый результат, ORDER BY ставят после последнего SELECT. Он применяется уже к итоговому набору строк.
Практика UNION ALL в SQL
В SQL Arena можно решать задачи на PostgreSQL, MySQL, ClickHouse и BigQuery прямо в браузере. У каждой задачи свои таблицы, а решение проверяется на скрытых данных, поэтому запрос должен работать по смыслу, а не только на показанном примере. Бесплатно доступны 292 задачи на всех четырёх диалектах без привязки карты.
Решать задачи на UNION