CodeRang
Темы SQL

UNION ALL в SQL: объединение результатов запросов

UNION ALL объединяет результаты нескольких SELECT и сохраняет повторяющиеся строки. Разберём, чем он отличается от UNION SQL, какие требования есть к колонкам и где ставить ORDER BY.

Обновлено · Команда SQL Arena

Что потренируете

  • Объединять результаты нескольких SELECT через UNION
  • Выбирать между UNION и UNION ALL
  • Следить за количеством и типами колонок
  • Находить общие строки через INTERSECT
  • Исключать один набор из другого через EXCEPT

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Соберите единый список действий агентов

В таблице ticket_events записаны действия сотрудников поддержки. Выведите пары agent_id и source для агентов, у которых были события resolved или escalated. Для resolved укажите строку resolved, для escalated — escalated. Объедините результаты через UNION и отсортируйте по agent_id, затем по source.

Запрос 1PostgreSQLv16
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;
Отправить
Результатsupport_agentsticket_events
Ответ принят

Как работает 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, а не между частями объединения.

SQLPostgreSQL v16
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_idsource
1escalated
1resolved
2escalated
3escalated
3resolved
4escalated
5escalated
5resolved

Ошибки при использовании UNION и UNION ALL

01

Использовать UNION, когда повторы нужно сохранить

UNION удаляет одинаковые строки после объединения выборок. Если каждая исходная запись важна сама по себе, например это отдельное событие или продажа, часть данных исчезнет. В таком случае нужен UNION ALL.

02

Объединять SELECT с разной структурой

У частей UNION должно совпадать количество колонок, а типы на одинаковых позициях должны быть совместимы. Нельзя без подготовки объединить запрос из двух колонок с запросом из трёх или поставить дату напротив значения несовместимого типа.

03

Считать, что UNION удаляет дубли только по одной колонке

Сравнивается вся результирующая строка. Два одинаковых agent_id не считаются дублем, если остальные значения различаются. Если нужна уникальность только по конкретному полю, задачу приходится формулировать иначе.

Задачи по теме в тренажёре

Курс «SQL с нуля»

После базового примера полезно перейти к задачам, где операции над множествами решают разные практические случаи. В SQL Arena есть бесплатные задачи на сбор списка статусов без повторов, объединение нескольких частей реестра и просмотренных объектов. На более сложных уровнях UNION и связанные приёмы встречаются внутри преобразования данных, расчётов по периодам и запросов, где к одному результату ведут несколько независимых путей. Это помогает увидеть важную границу: UNION нужен не для соединения колонок разных таблиц, а для складывания строк совместимой структуры. Для системного продолжения можно перейти в курс «SQL с нуля»: там теория разбирается вместе с задачами в уроках.

Частые вопросы

Что такое 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