UNION ALL
UNION ALL — это оператор языка SQL (Structured Query Language), предназначенный для объединения результатов двух или более запросов SELECT в единый результирующий набор данных. В отличие от оператора UNION, UNION ALL не выполняет удаление дублирующихся строк, возвращая все строки из каждого участвующего в объединении запроса, включая полные дубликаты. Оператор относится к категории операторов работы с наборами данных (set operations) и является частью стандарта SQL.
Синтаксис и общее описание
Основной синтаксис оператора UNION ALL выглядит следующим образом:
``sql SELECT column1, column2, ... FROM table1 [WHERE condition1] UNION ALL SELECT column1, column2, ... FROM table2 [WHERE condition2] [UNION ALL SELECT column1, column2, ... FROM tableN [WHERE conditionN]] [ORDER BY column1, column2, ...]; ``
Ключевые требования к использованию:
- Количество столбцов и их порядок во всех объединяемых запросах должны совпадать.
- Соответствующие столбцы должны иметь совместимые типы данных (например, числовые с числовыми, строковые со строковыми). Автоматическое приведение типов возможно, но может приводить к ошибкам или неожиданным результатам.
- Имена столбцов в результирующем наборе определяются первым запросом.
- Оператор
ORDER BYприменяется ко всему результирующему набору и должен ссылаться на имена столбцов из первого запроса или на их порядковые номера.
Отличие от UNION
Основное различие между UNION и UNION ALL заключается в обработке дублирующихся строк. UNION перед возвратом результата выполняет сортировку и удаление всех повторяющихся строк (операция DISTINCT). UNION ALL просто добавляет строки из последующих запросов к строкам первого без какой-либо проверки на дубликаты.
Следствием этого являются два ключевых отличия:
- Производительность.
UNION ALLвыполняется значительно быстрее, чемUNION, так как не требует затрат на сортировку и сравнение строк для выявления дубликатов. Для больших наборов данных разница в скорости может быть существенной. - Результат.
UNION ALLгарантирует, что в результирующем наборе будет ровно столько строк, сколько их суммарно во всех объединяемых запросах.UNIONможет вернуть меньше строк, если в наборах есть совпадающие записи.
Примеры использования
Пример 1: Объединение данных из разных таблиц
Предположим, есть две таблицы: employees_2023 и employees_2024, содержащие списки сотрудников, принятых на работу в соответствующие годы. Для получения полного списка всех когда-либо принятых сотрудников можно использовать UNION ALL, так как один и тот же человек не может быть принят дважды в разные годы (или если такое возможно, то нужно показать все записи):
``sql SELECT first_name, last_name, hire_date FROM employees_2023 UNION ALL SELECT first_name, last_name, hire_date FROM employees_2024; ``
Пример 2: Разделение данных по условию
Часто UNION ALL используется для создания сводных отчётов, где данные группируются по разным критериям. Например, нужно получить количество заказов по категориям «Малые» (до 1000 руб.) и «Крупные» (от 1000 руб.):
``sql SELECT 'Малые' AS category, COUNT() AS order_count FROM orders WHERE amount < 1000 UNION ALL SELECT 'Крупные', COUNT() FROM orders WHERE amount >= 1000; ``
Пример 3: Обход ограничения OR в индексах
В некоторых СУБД (например, PostgreSQL, Oracle) оптимизатор может эффективно обрабатывать запросы с UNION ALL как два отдельных сканирования индекса, в то время как эквивалентный запрос с OR может привести к полному сканированию таблицы. Это позволяет ускорить сложные фильтрации.
Производительность и оптимизация
Оператор UNION ALL считается одним из самых эффективных способов объединения данных в SQL. Основные рекомендации по его использованию:
- Предпочтение UNION ALL. Если нет уверенности, что дубликаты отсутствуют, или их наличие не критично для результата, следует использовать
UNION ALLвместоUNION. Это существенно снижает нагрузку на сервер базы данных. - Фильтрация как можно раньше. Условия
WHEREв каждом из объединяемых запросов должны быть максимально селективными, чтобы уменьшить объём данных, передаваемых на этап объединения. - Использование подзапросов. В некоторых случаях для оптимизации можно сначала отфильтровать и агрегировать данные внутри каждого подзапроса, а затем объединить их с помощью
UNION ALL. Это особенно полезно при работе с большими таблицами.
Ограничения и особенности
- Порядок строк. Без явного указания
ORDER BYпорядок строк в результатеUNION ALLне гарантируется. Обычно СУБД возвращает строки в порядке выполнения запросов (сначала все строки первого, затем второго и т.д.), но это поведение не является частью стандарта и может меняться. - Типы данных. При объединении столбцов разных типов данных СУБД пытается выполнить неявное приведение. Если это невозможно, возникает ошибка. Рекомендуется явно приводить типы с помощью функции
CASTилиCONVERT. - Ограничения длины. В некоторых СУБД (например, в MySQL) при объединении столбцов типа
VARCHARразной длины результирующий столбец будет иметь длину, равную максимальной из объединяемых. Это может привести к неожиданному усечению данных. - Использование с другими операторами.
UNION ALLможет комбинироваться сUNION,INTERSECTиEXCEPT(илиMINUS), но порядок выполнения операций определяется приоритетом и скобками. По умолчаниюUNIONиUNION ALLимеют одинаковый приоритет и выполняются слева направо.
Применение в различных СУБД
Оператор UNION ALL поддерживается всеми основными реляционными системами управления базами данных, включая:
- PostgreSQL
- MySQL / MariaDB
- Oracle Database
- Microsoft SQL Server
- SQLite
- IBM Db2
Синтаксис и поведение оператора практически идентичны во всех этих системах, за исключением незначительных особенностей, связанных с обработкой типов данных и сортировкой.
Альтернативы
В некоторых случаях UNION ALL может быть заменён другими конструкциями, такими как:
- Полное внешнее соединение (FULL OUTER JOIN). Используется, когда нужно объединить данные из двух таблиц по ключу, но при этом показать все строки из обеих таблиц, включая несовпадающие.
- Подзапросы с агрегацией. Если цель — просто сложить результаты агрегатных функций из разных таблиц, можно использовать подзапросы в
SELECT. - Функции оконной агрегации. Для сложных отчётов, где нужно одновременно видеть детальные и агрегированные данные, оконные функции могут быть более гибким решением, чем
UNION ALL.
Однако UNION ALL остаётся наиболее простым, интуитивно понятным и производительным способом простого объединения строк из разных источников.
Источники
- ISO/IEC 9075:2016 — стандарт языка SQL.
- Документация PostgreSQL: «UNION, CASE, and Related Constructs».
- Документация MySQL: «UNION Clause».
- Документация Oracle Database: «Set Operators».
- Документация Microsoft SQL Server: «Set Operators (UNION, INTERSECT, EXCEPT)».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →