Открыть сервис

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 просто добавляет строки из последующих запросов к строкам первого без какой-либо проверки на дубликаты.

Следствием этого являются два ключевых отличия:

  1. Производительность. UNION ALL выполняется значительно быстрее, чем UNION, так как не требует затрат на сортировку и сравнение строк для выявления дубликатов. Для больших наборов данных разница в скорости может быть существенной.
  2. Результат. 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 поддерживается всеми основными реляционными системами управления базами данных, включая:

Синтаксис и поведение оператора практически идентичны во всех этих системах, за исключением незначительных особенностей, связанных с обработкой типов данных и сортировкой.

Альтернативы

В некоторых случаях 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 →