Оператор SQL UNION
Оператор SQL UNION используется для объединения двух и более запросов оператора SQL SELECT.
Оператор SQL UNION имеет следующий синтаксис:
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2
Важно отметить, что каждый из операторов SQL SELECT должен иметь в своем запросе одинаковое количество столбцов и типы возвращаемых данных, иначе произойдет ошибка при формировании результирующей таблицы.
Примеры оператора SQL UNION. Имеется следующая таблица Artists:
| Singer | Album | Year | Sale |
| The Prodigy | Invaders Must Die | 2008 | 1200000 |
| Drowning Pool | Sinner | 2001 | 400000 |
| Massive Attack | Mezzanine | 1998 | 2300000 |
| The Prodigy | Fat of the Land | 1997 | 600000 |
| The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
| Massive Attack | 100th Window | 2003 | 1200000 |
| Drowning Pool | Full Circle | 2007 | 800000 |
| Massive Attack | Danny The Dog | 2004 | 1900000 |
| Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. С помощью оператора SQL UNION вывести название исполнителя и альбома с использованием оператора UNION:
SELECT Singer FROM Artists UNION SELECT Album FROM Artists
| Singer | Album |
| The Prodigy | Invaders Must Die |
| Drowning Pool | Sinner |
| Massive Attack | Mezzanine |
| The Prodigy | Fat of the Land |
| The Prodigy | Music For The Jilted Generation |
| Massive Attack | 100th Window |
| Drowning Pool | Full Circle |
| Massive Attack | Danny The Dog |
| Drowning Pool | Resilience |
SQL — Оператор UNION
Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT. Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов. Столбцы также должны иметь похожие типы данных и в каждой инструкции SELECT быть в том же порядке.
Синтаксис UNION
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
Синтаксис UNION ALL
Оператор UNION по умолчанию выбирает только разные значения. Чтобы разрешить повторяющиеся значения, используйте UNION ALL:
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
Пример UNION
Следующий оператор SQL выбирает все разные города (только отдельные значения) от «users» и «delivery»:
Пример:
SELECT city FROM users UNION SELECT city FROM delivery ORDER BY city;
Пример SQL UNION ALL
Следующий оператор SQL выбирает все города (дублирующиеся значения также) из «users» и «delivery»:
Пример:
SELECT city FROM users UNION ALL SELECT city FROM delivery ORDER BY city;
SQL UNION с WHERE
Следующий оператор SQL выбирает все разные испанские города (только отдельные значения) от «users» и «delivery»:
Пример:
SELECT city, country FROM users WHERE country='Spain' UNION SELECT city, country FROM delivery WHERE country='Spain' ORDER BY city;
SQL UNION ALL с WHERE
Следующий оператор SQL выбирает все испанские города (повторяющиеся значения) также из «users» и «delivery»:
Пример:
SELECT city, country FROM users WHERE country='Spain' UNION ALL SELECT city, country FROM delivery WHERE country = 'Spain' ORDER BY city;
Объединение стр. 1
Для объединения запросов используется служебное слово UNION :
Предложение UNION приводит к появлению в результирующем наборе всех строк каждого из запросов. При этом, если определен параметр ALL , то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе присутствуют только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно задавать порядок объединения.
Операция объединения может быть выполнена только при выполнении следующих условий:
- количество выходных столбцов каждого из запросов должно быть одинаковым;
- выходные столбцы каждого из запросов должны быть совместимы между собой (в порядке их следования) по типам данных;
- в результирующем наборе используются имена столбцов, заданные в первом запросе;
- предложение ORDER BY применяется к результату соединения, поэтому оно может быть указано только в конце всего составного запроса.
Найти номера моделей и цены ПК и портативных компьютеров:
Консоль
Выполнить
Операторы работы с наборами — UNION (Transact-SQL)
Сцепляет результаты двух запросов в один результирующий набор. Вы указываете, будет ли результирующий набор включать повторяющиеся строки:
- UNION ALL — повторяющиеся строки включаются.
- UNION — повторяющиеся строки исключаются.
Операция UNION отличается от операции JOIN:
- В результате операции UNION сцепляются результирующие наборы двух запросов. При этом операция UNION не создает отдельные строки для столбцов, полученных из двух таблиц.
- Операция JOIN сравнивает столбцы из двух таблиц и создает результирующие строки, которые состоят из столбцов из двух таблиц.
Ниже приведены основные правила объединения результирующих наборов двух запросов с помощью операции UNION:
- количество и порядок столбцов должны быть одинаковыми во всех запросах;
- типы данных должны быть совместимыми.
Синтаксис
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
| ( ) Спецификация запроса или выражение запроса, возвращающее данные для объединения с данными из другой спецификации запроса или выражения запроса. Определения столбцов, которые являются частью операции UNION, не должны совпадать, однако должны быть совместимыми посредством неявного преобразования. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных. Если типы одинаковы, но различаются по точности, масштабу или длине, результат определяется на основе тех же самых правил, которые действуют при объединении выражений. Дополнительные сведения см. в разделе Точность, масштаб и длина (Transact-SQL).
Столбцы типа данных xml должны быть эквивалентны друг другу. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.
UNION
Указывает на то, что несколько результирующих наборов следует объединить и возвратить в виде единого результирующего набора.
ВСЕ
Объединяет в результирующий набор все строки, в том числе повторяющиеся. Если обратное не указано, дубликаты строк удаляются.
Примеры
А. Использование простого UNION
При выполнении следующего примера в результирующий набор включается содержимое столбцов ProductModelID и Name таблиц ProductModel и Gloves .
-- Uses AdventureWorks IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO -- Here is the simple union. -- Uses AdventureWorks SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO
B. Использование SELECT INTO с UNION
При выполнении следующего примера предложение INTO во второй инструкции SELECT указывает, что в таблице с именем ProductResults содержится итоговый результирующий набор объединения выбранных столбцов таблиц ProductModel и Gloves . Таблица Gloves была создана в результате выполнения первой инструкции SELECT .
-- Uses AdventureWorks IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL DROP TABLE dbo.ProductResults; GO IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO -- Uses AdventureWorks SELECT ProductModelID, Name INTO dbo.ProductResults FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO SELECT ProductModelID, Name FROM dbo.ProductResults;
C. Использование UNION двух инструкций SELECT с ORDER BY
При использовании предложения UNION необходимо соблюдать порядок следования определенных параметров. В следующем примере показаны случаи правильного и неверного использования UNION в двух инструкциях SELECT , в которых необходимо переименовать столбцы на выходе.
-- Uses AdventureWorks IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO /* INCORRECT */ -- Uses AdventureWorks SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) ORDER BY Name UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO /* CORRECT */ -- Uses AdventureWorks SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO
D. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
В следующих примерах предложение UNION используется для комбинирования результатов из трех таблиц, содержащих по 5 одинаковых строк данных. В первом примере используется предложение UNION ALL , в результате чего выдаются все 15 строк. Во втором примере предложение UNION используется без ключевого слова ALL , что позволяет удалить повторяющиеся строки из комбинированного результата выполнения трех инструкций SELECT и вывести только 5 строк.
В третьем примере с первым предложением ALL используется ключевое слово UNION , а во втором предложении UNION вместо ключевого слова ALL используются скобки. Сначала выполняется второе предложение UNION , которое заключено в скобки. В результате возвращаются 5 строк, так как параметр ALL не используется и все повторяющиеся строки удаляются. Полученные 5 строк совмещаются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL . В данном случае повторяющиеся строки двух множеств, состоящих из пяти строк, не удаляются. Окончательный результат состоит из 10 строк.
-- Uses AdventureWorks IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL DROP TABLE dbo.EmployeeOne; GO IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL DROP TABLE dbo.EmployeeTwo; GO IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL DROP TABLE dbo.EmployeeThree; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeOne FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeTwo FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeThree FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO -- Union ALL SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeOne UNION ALL SELECT LastName, FirstName ,JobTitle FROM dbo.EmployeeTwo UNION ALL SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeThree; GO SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeOne UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree; GO SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeOne UNION ALL ( SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree ); GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
Д. Использование простого UNION
При выполнении приведенного ниже примера в результирующий набор включается содержимое столбцов CustomerKey таблиц FactInternetSales и DimCustomer . Так как ключевое слово ALL не используется, повторяющиеся значения не включаются в результаты.
-- Uses AdventureWorks SELECT CustomerKey FROM FactInternetSales UNION SELECT CustomerKey FROM DimCustomer ORDER BY CustomerKey;
F. Использование UNION двух инструкций SELECT с ORDER BY
Если какая-либо инструкция SELECT в инструкции UNION содержит предложение ORDER BY, это предложение должно находиться после всех инструкций SELECT. В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT , в которых столбец сортируется с помощью предложения ORDER BY.
-- Uses AdventureWorks -- INCORRECT SELECT CustomerKey FROM FactInternetSales ORDER BY CustomerKey UNION SELECT CustomerKey FROM DimCustomer ORDER BY CustomerKey; -- CORRECT USE AdventureWorksPDW2012; SELECT CustomerKey FROM FactInternetSales UNION SELECT CustomerKey FROM DimCustomer ORDER BY CustomerKey;
G. Использование UNION двух инструкций SELECT с WHERE и ORDER BY
В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT , в которых требуются предложения WHERE и ORDER BY.
-- Uses AdventureWorks -- INCORRECT SELECT CustomerKey FROM FactInternetSales WHERE CustomerKey >= 11000 ORDER BY CustomerKey UNION SELECT CustomerKey FROM DimCustomer ORDER BY CustomerKey; -- CORRECT USE AdventureWorksPDW2012; SELECT CustomerKey FROM FactInternetSales WHERE CustomerKey >= 11000 UNION SELECT CustomerKey FROM DimCustomer ORDER BY CustomerKey;
H. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
В приведенных ниже примерах UNION используется для объединения результатов из той же самой таблицы с целью продемонстрировать эффект от применения ALL и скобок с UNION .
В первом примере UNION ALL используется для вывода повторяющихся записей. Каждая строка из исходной таблицы возвращается три раза. Во втором примере UNION используется без ключевого слова ALL , что позволяет удалить повторяющиеся строки из объединенных результатов выполнения трех инструкций SELECT и вывести только неповторяющиеся строки из исходной таблицы.
В третьем примере с первым оператором UNION используется ключевое слово ALL , а во втором предложении UNION вместо ключевого слова ALL используются скобки. Второе предложение UNION обрабатывается первым, так как оно заключено в скобки. Оно возвращает только неповторяющиеся строки из таблицы, так как параметр ALL не используется и повторяющиеся строки исключаются. Полученные строки объединяются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL . В данном случае повторяющиеся строки двух множеств не удаляются.
-- Uses AdventureWorks SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION ALL SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION ALL SELECT CustomerKey, FirstName, LastName FROM DimCustomer; SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION SELECT CustomerKey, FirstName, LastName FROM DimCustomer; SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION ALL ( SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION SELECT CustomerKey, FirstName, LastName FROM DimCustomer );
