SQL
СОЮЗ / СОЮЗ ВСЕ
Поиск…
Вступление
Синтаксис
- SELECT column_1 [, column_2] FROM table_1 [, table_2] [Условие WHERE]
СОЮЗ | СОЮЗ ВСЕ
SELECT column_1 [, column_2] FROM table_1 [, table_2] [Условие WHERE]
замечания
UNION
и UNION ALL
объединяют результирующий набор из двух или более идентично структурированных операторов SELECT в единый результат / таблицу.
Оба столбца и типы столбцов для каждого запроса должны совпадать, чтобы работать с UNION
/ UNION ALL
.
Разница между запросом UNION
и UNION ALL
заключается в том, что предложение UNION
удалит любые повторяющиеся строки в результате, когда UNION ALL
не будет.
Это отличное удаление записей может значительно замедлить запросы, даже если нет четких строк, которые должны быть удалены из-за этого, если вы знаете, что не будет никаких дубликатов (или не важно) всегда по умолчанию для UNION ALL
для более оптимизированного запроса.
Основной запрос UNION ALL
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Предположим, мы хотим извлечь имена всех managers
из наших отделов.
Используя UNION
мы можем получить всех сотрудников из отдела кадров и финансов, которые занимают position
manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Оператор UNION
удаляет повторяющиеся строки из результатов запроса. Поскольку в обоих отделах есть люди с одинаковым именем и позицией, мы используем UNION ALL
, чтобы не удалять дубликаты.
Если вы хотите использовать псевдоним для каждого столбца вывода, вы можете просто поместить их в первый оператор select, как показано ниже:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Простое объяснение и пример
Проще говоря:
-
UNION
объединяет 2 набора результатов при удалении дубликатов из набора результатов -
UNION ALL
объединяет 2 набора результатов, не пытаясь удалить дубликаты
Одна из ошибок, которую делают многие люди, - использовать
UNION
когда им не нужно удалять дубликаты. Дополнительные затраты по сравнению с большими наборами результатов могут быть очень значительными.
Когда вам понадобится UNION
Предположим, вам нужно отфильтровать таблицу с двумя разными атрибутами, и вы создали отдельные некластеризованные индексы для каждого столбца. UNION
позволяет вам использовать оба индекса при одновременном предотвращении дублирования.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Это упрощает настройку производительности, поскольку для оптимального выполнения этих запросов необходимы простые индексы. Вы даже можете обойтись с небольшим количеством некластеризованных индексов, улучшая общую производительность записи по сравнению с исходной таблицей.
Когда вам может понадобиться UNION ALL
Предположим, вам по-прежнему необходимо отфильтровать таблицу по двум атрибутам, но вам не нужно фильтровать повторяющиеся записи (либо потому, что это не имеет значения, либо ваши данные не будут создавать дубликатов во время объединения из-за вашей модели данных).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Это особенно полезно при создании представлений, которые объединяют данные, которые предназначены для физического разделения по нескольким таблицам (возможно, по соображениям производительности, но по-прежнему хотят свертывать записи). Так как данные уже разделены, то с помощью механизма удаления базы данных дубликаты не добавляют значения и просто добавляют дополнительное время обработки к запросам.