
Union в SQL позволяет объединять результаты нескольких SELECT-запросов в один набор данных. Важно учитывать, что все объединяемые запросы должны возвращать одинаковое количество столбцов с совместимыми типами данных. При несоответствии типов запрос завершится ошибкой.
Одним из ключевых отличий UNION от UNION ALL является удаление дубликатов. UNION автоматически исключает повторяющиеся строки, что влияет на производительность при больших объемах данных. Если дубликаты допустимы, стоит использовать UNION ALL для ускорения выполнения.
Применение UNION эффективно при объединении данных из разных таблиц с одинаковой структурой. Например, для отчета о продажах из нескольких филиалов или выборки пользователей с разных платформ. Также UNION используется для подготовки сводных отчетов без создания дополнительных таблиц или сложных JOIN-операций.
При работе с UNION важно следить за сортировкой и индексами: оптимизация запросов через индексы на объединяемых столбцах может существенно ускорить выполнение. Кроме того, использование функций агрегации и фильтров в каждом подзапросе позволяет минимизировать объем обрабатываемых данных и снизить нагрузку на сервер.
Union в SQL: примеры использования и особенности работы

Оператор UNION объединяет результаты двух или более SELECT-запросов в один набор данных. Каждое SELECT-выражение должно возвращать одинаковое количество столбцов с совместимыми типами данных. Например, объединение таблиц клиентов и поставщиков по полям «Имя» и «Город»:
SELECT Name, City FROM Customers
UNION
SELECT Name, City FROM Suppliers;
По умолчанию UNION исключает дубликаты. Чтобы сохранить все строки, используется UNION ALL:
SELECT Name, City FROM Customers
UNION ALL
SELECT Name, City FROM Suppliers;
UNION применим для создания сводных отчетов, когда данные распределены по разным таблицам с одинаковой структурой. Например, суммарные продажи по кварталам из разных регионов:
SELECT 'Q1' AS Quarter, SUM(Sales) AS TotalSales FROM Region1
UNION
SELECT 'Q1', SUM(Sales) FROM Region2;
При использовании UNION важно соблюдать порядок столбцов, так как совпадение происходит по позициям, а не по именам. Несоответствие типов вызывает ошибку, поэтому рекомендуется использовать явное преобразование типов:
SELECT CAST(EmployeeID AS VARCHAR), Name FROM Employees
UNION
SELECT CAST(ClientID AS VARCHAR), Name FROM Clients;
Также UNION поддерживает сортировку результата, но ORDER BY можно применить только к финальному набору данных:
SELECT Name, City FROM Customers
UNION
SELECT Name, City FROM Suppliers
ORDER BY Name;
Практическая рекомендация: если требуется максимальная производительность и дубликаты допустимы, лучше использовать UNION ALL, так как проверка уникальности в обычном UNION увеличивает нагрузку на сервер.
Объединение результатов двух таблиц с одинаковыми колонками

Для объединения данных из двух таблиц с одинаковой структурой используется оператор UNION. Он объединяет строки из обеих таблиц в один результат, исключая дубликаты. Если необходимо сохранить все строки, включая повторяющиеся, применяется UNION ALL.
Пример: есть таблицы sales_2023 и sales_2024 с колонками id, product, quantity. Объединение всех продаж выглядит так:
SELECT id, product, quantity FROM sales_2023
UNION
SELECT id, product, quantity FROM sales_2024;
Для сохранения повторов используется:
SELECT id, product, quantity FROM sales_2023
UNION ALL
SELECT id, product, quantity FROM sales_2024;
Важно, чтобы типы колонок совпадали по порядку. Несовпадение типов вызовет ошибку, поэтому рекомендуется явно приводить типы через CAST:
SELECT id, product, CAST(quantity AS INT) FROM sales_2023
UNION
SELECT id, product, CAST(quantity AS INT) FROM sales_2024;
При работе с UNION порядок колонок влияет на результат и дальнейшую сортировку. Чтобы упорядочить объединенные данные, достаточно применить ORDER BY к итоговому запросу:
SELECT id, product, quantity FROM sales_2023
UNION
SELECT id, product, quantity FROM sales_2024
ORDER BY product, quantity DESC;
Для анализа больших объемов данных UNION ALL предпочтительнее с точки зрения производительности, так как не требует удаления дубликатов. UNION стоит применять только при необходимости исключить повторяющиеся строки.
Использование UNION удобно при объединении исторических и текущих данных, при создании сводных отчетов или при интеграции таблиц из разных источников с идентичной структурой.
Различия между UNION и UNION ALL на практике
UNION выполняет объединение результатов двух и более запросов с автоматическим удалением дубликатов. В случае больших объемов данных это может замедлять выполнение, так как СУБД сначала формирует полный набор, а затем проводит сортировку и фильтрацию повторов.
UNION ALL объединяет результаты без удаления дубликатов, что позволяет ускорить обработку и снизить нагрузку на сервер. Этот вариант особенно эффективен при работе с таблицами, где дублирующихся записей нет или их наличие допустимо для аналитики.
Пример использования UNION:
SELECT id, name FROM clients_2023
UNION
SELECT id, name FROM clients_2024;
Если в обеих таблицах встречаются одинаковые id и name, в итоговом наборе они будут показаны только один раз. Для UNION ALL:
SELECT id, name FROM clients_2023
UNION ALL
SELECT id, name FROM clients_2024;
Повторяющиеся строки сохраняются, что позволяет анализировать все транзакции без потерь информации.
При практическом выборе между UNION и UNION ALL ориентируйтесь на цель запроса: если важна уникальность, используйте UNION; если приоритет – производительность и сохранение всех записей, применяйте UNION ALL. Для больших таблиц рекомендуется проводить тесты производительности, так как удаление дубликатов может значительно увеличить время выполнения.
Важно учитывать индексы: UNION может использовать индексы для сортировки и фильтрации, но дополнительная операция сортировки увеличивает нагрузку. UNION ALL использует индексы только для выборки, без затрат на проверку уникальности.
Использование UNION для объединения разных типов данных
Оператор UNION требует, чтобы количество столбцов в объединяемых запросах совпадало, а типы данных были совместимы или приводимы друг к другу. Например, числовые типы INT и DECIMAL можно объединять без ошибок, так как SQL автоматически выполняет неявное приведение.
Если один запрос возвращает VARCHAR, а другой CHAR, UNION корректно обработает их как текстовые данные. Однако попытка объединить INT и DATE без явного преобразования вызовет ошибку. Для решения используют функцию CAST или CONVERT, например:
SELECT CAST(дата AS VARCHAR(10)) FROM события UNION SELECT имя FROM пользователи;
При работе с типами BOOLEAN и INT рекомендуется явно привести значения к единому формату: SELECT CASE WHEN активен THEN 1 ELSE 0 END FROM клиенты UNION SELECT уровень FROM права;. Это предотвращает неожиданные ошибки при выполнении запроса.
Для объединения чисел с текстом лучше сразу использовать преобразование числового значения в строку: SELECT CAST(сумма AS VARCHAR) FROM заказы UNION SELECT код_продукта FROM товары;. Это сохраняет корректность данных и порядок сортировки.
Важно помнить, что UNION исключает дубликаты. Если данные с разными типами могут совпадать после приведения, но по смыслу различны, используют UNION ALL, чтобы сохранить все строки.
При объединении сложных типов, таких как JSON или XML, необходимо приводить их к тексту с помощью CAST или функций сериализации. Это позволяет корректно выполнять агрегацию и фильтрацию после объединения.
Следовательно, ключевым правилом работы с разными типами данных через UNION является явное приведение несовместимых типов и использование UNION ALL для сохранения всех исходных значений, что повышает предсказуемость результатов.
Фильтрация и сортировка данных после UNION

После объединения нескольких SELECT-запросов с помощью UNION результаты можно фильтровать и сортировать, используя WHERE и ORDER BY в основном запросе. Важно помнить, что:
- Фильтрация внутри каждого SELECT применяется до объединения.
- Фильтрация после UNION применяется к объединённому набору данных.
- ORDER BY без скобок сортирует итоговый результат, а не отдельные SELECT-запросы.
Пример фильтрации после UNION:
SELECT id, name, category FROM products_2023
UNION
SELECT id, name, category FROM products_2024
WHERE category = 'Electronics';
В этом случае фильтр применится только ко второй выборке. Для фильтрации итогового результата используют конструкцию:
SELECT * FROM (
SELECT id, name, category FROM products_2023
UNION
SELECT id, name, category FROM products_2024
) AS combined
WHERE category = 'Electronics';
Сортировка итогового набора данных выполняется через ORDER BY в конце объединения:
SELECT * FROM (
SELECT id, name, category FROM products_2023
UNION
SELECT id, name, category FROM products_2024
) AS combined
ORDER BY name ASC, id DESC;
Рекомендации по сортировке и фильтрации после UNION:
- Всегда используйте скобки для UNION, если применяете фильтры или сортировку к объединённым данным.
- Для сортировки по нескольким столбцам указывайте их порядок явно (ASC/DESC).
- Если нужны дубликаты, используйте UNION ALL, иначе UNION автоматически удаляет повторяющиеся строки.
- Фильтры внутри подзапросов повышают производительность при больших таблицах.
- Индексы на столбцах, участвующих в фильтрации и сортировке, ускоряют обработку объединённого результата.
Ограничения на количество и порядок столбцов при объединении
При использовании оператора UNION в SQL каждая объединяемая таблица или запрос должны иметь одинаковое количество столбцов. Несоответствие количества столбцов приведет к ошибке выполнения.
Порядок столбцов также критически важен. SQL сопоставляет столбцы по позиции, а не по имени. Это означает, что первый столбец первого запроса объединяется с первым столбцом второго запроса и так далее. Несоответствие типов данных может вызвать ошибку или привести к автоматическому преобразованию типов, что иногда снижает производительность.
Рассмотрим пример:
| Запрос 1 | Запрос 2 |
|---|---|
| SELECT id, name, salary FROM employees | SELECT emp_id, emp_name, salary_amount FROM staff |
Здесь количество столбцов одинаковое (3), и типы данных совместимы: id → emp_id (INTEGER), name → emp_name (VARCHAR), salary → salary_amount (DECIMAL). Результат объединения корректен.
Если требуется объединить таблицы с разным количеством столбцов, рекомендуется использовать NULL или константные значения для выравнивания:
| Запрос 1 | Запрос 2 |
|---|---|
| SELECT id, name, salary FROM employees | SELECT emp_id, emp_name, NULL AS salary FROM contractors |
Для контроля порядка столбцов полезно явно указывать имена в списке SELECT. Это предотвращает ошибки при изменении структуры таблиц и повышает читаемость запроса.
Резюмируя, ключевые правила: одинаковое количество столбцов, сопоставление по позиции, совместимость типов данных. Игнорирование этих требований приводит к ошибкам и некорректным результатам объединения.
Примеры вложенных UNION для сложных запросов
Вложенные UNION позволяют объединять результаты нескольких запросов на разных уровнях, обеспечивая гибкость при работе с комплексными данными.
Пример 1: Объединение продаж по регионам и категориям товаров с последующей агрегацией:
SELECT region, SUM(total) AS total_sales
FROM (
SELECT region, total FROM sales_online
UNION ALL
SELECT region, total FROM sales_offline
) AS combined_sales
GROUP BY region;
Здесь внутренний UNION ALL объединяет онлайн и офлайн продажи, а внешний запрос выполняет суммирование по регионам.
Пример 2: Получение уникальных клиентов, совершивших покупки в разных магазинах, с фильтром по дате:
SELECT customer_id
FROM (
SELECT customer_id FROM store_a
WHERE purchase_date >= '2025-01-01'
UNION
SELECT customer_id FROM store_b
WHERE purchase_date >= '2025-01-01'
) AS recent_customers;
Использование UNION исключает дубликаты клиентов, а вложенный SELECT позволяет легко добавлять условия фильтрации.
Пример 3: Сложная агрегация с несколькими уровнями объединения:
SELECT category, SUM(amount) AS total_amount
FROM (
SELECT category, amount FROM (
SELECT category, amount FROM online_sales
UNION ALL
SELECT category, amount FROM offline_sales
) AS all_sales
WHERE amount > 100
) AS filtered_sales
GROUP BY category;
Сначала объединяются все продажи, затем фильтруются транзакции больше 100 единиц, и только после этого выполняется группировка по категориям.
Рекомендации по использованию вложенных UNION:
- Всегда используйте UNION ALL, если дубликаты допустимы, чтобы улучшить производительность.
- Применяйте вложенные UNION для предварительной фильтрации данных перед агрегацией.
- Следите за одинаковым числом столбцов и совместимыми типами данных на всех уровнях объединения.
- Для сложных условий объединения разделяйте запросы на логические блоки для удобства чтения и поддержки.
Вопрос-ответ:
В чем разница между UNION и UNION ALL в SQL?
Оператор UNION объединяет результаты двух или более SELECT-запросов в один набор данных, исключая повторяющиеся строки. UNION ALL также объединяет результаты, но сохраняет все дубликаты. Например, если два запроса возвращают одинаковую запись, UNION оставит её в итоговой таблице только один раз, а UNION ALL — дважды. Выбор между ними зависит от задачи: если важно исключить повторяющиеся значения, используют UNION; если важна производительность и не требуется удалять дубликаты, предпочтителен UNION ALL.
Можно ли использовать UNION для объединения таблиц с разным количеством столбцов?
Нет, для работы оператора UNION количество и порядок столбцов в SELECT-запросах должны совпадать. Типы данных столбцов в соответствующих позициях должны быть совместимы или допускают приведение. Если таблицы имеют разное число столбцов, нужно сначала привести их к одинаковой структуре с помощью выражений, например, используя константы или NULL для отсутствующих столбцов.
Как влияет порядок столбцов на результат объединения через UNION?
Порядок столбцов имеет прямое значение: данные из первой колонки первого запроса будут объединены с данными первой колонки второго запроса и так далее. Несоответствие порядка может привести к некорректной интерпретации данных. Например, если в одной таблице первая колонка — имя, а во второй — возраст, при прямом объединении через UNION значения могут смешаться. Для правильного результата следует явно указывать нужный порядок в SELECT-запросах.
Можно ли использовать UNION вместе с ORDER BY и как это влияет на результат?
Да, ORDER BY применяют к итоговому набору данных после объединения всех SELECT-запросов. Внутри каждого отдельного запроса ORDER BY не изменит порядок в итоговом объединении. Чтобы отсортировать результат UNION, оператор ORDER BY пишут после последнего SELECT-запроса. При этом сортировка учитывает все строки из объединённых запросов и позволяет получить единый упорядоченный список.
