Как применять оператор SQL UNION для объединения результатов запросов
Оператор языка SQL UNION предназначен для объединения результирующих таблиц базы данных, полученных с применением слова SELECT. Условие объединения результирующих таблиц: совпадение числа, порядка следования и типа данных столбцов. ORDER BY следует применять к результату объединения и размещать только в конце составного запроса. Оператор UNION имеет следующий синтаксис:
В этой конструкции объединяемые запросы могут иметь условия в секции WHERE, а могут не иметь их. При помощи оператора UNION можно объединить запросы на извлечение данных как из одной таблицы, так и из разных.
При использовании оператора UNION без слова ALL результат не содержит дубликатов, а со словом ALL — содержит дубликаты.
Итоги и индивидуальные значения в одной таблице с помощью оператора SQL UNION
Одним запросом можно вывести из таблицы индивидуальные значения столбцов, например, число лет, проработанных сотрудниками фирмы, размеры их заработной платы и другие. Другим запросом — с использованием агрегатных функций — можно получить, например, сумму заработных плат, получаемых сотрудниками отделов или занимающих те или иные должности, или среднее число лет трудового стажа (в таких запросах применяется группировка с помощью оператора GROUP BY).
А если нам требуется получить в одной таблице и сводку всех индивидуальных значений, и итоговые значения? Здесь на помощь приходит оператор SQL UNION, с помощью которого два запроса объединяются. К результату объединения требуется применить упорядочение, используя оператор ORDER BY. Для чего это необходимо, будет лучше понятно из примеров.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
Пример 1. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос возвращает индивидуальные размеры заработной платы, упорядоченные по должностям:
Результатом выполнения запроса будет следующая таблица:
| Name | Job | Salary |
| Sanders | Mgr | 18357.5 |
| Marenghi | Mgr | 17506.8 |
| Pernal | Sales | 18171.2 |
| Doctor | Sales | 12322.4 |
| Factor | Sales | 16228.7 |
Второй запрос вернёт суммарную заработную плату по должностям. Мы уже готовим этот запрос для соединения с первым, поэтому будем помнить, что условием соединения является равное число столбцов, совпадение их названий, порядка следования и типов данных. Поэтому включаем в таблицу с итогами также столбец Name с произвольным значением ‘Z-TOTAL’:
Результатом выполнения запроса будет следующая таблица:
| Name | Job | Salary |
| Z-TOTAL | Mgr | 35864.3 |
| Z-TOTAL | Sales | 46722.3 |
Теперь объединим запросы при помощи оператора UNION и применим оператору ORDER BY к результату объединения. Группировать следует по двум столбцам: должность (Job) и имя (Name), чтобы строки с итоговыми (суммарными) значениями, в которых значение имени — ‘Z-TOTAL’, находились ниже строк с индивидуальными значениями. Объединение результатов запросов будет следующим:
Результатом выполнения запроса с оператором UNION будет следующая таблица, в которой каждая первая строка в каждой группе должностей будет содержать суммарную заработную плату сотрудников, работающих на этой должности:
| Name | Job | Salary |
| Marenghi | Mgr | 17506.8 |
| Sanders | Mgr | 18357.5 |
| Z-TOTAL | Mgr | 35864.3 |
| Doctor | Sales | 12322.4 |
| Factor | Sales | 16228.7 |
| Pernal | Sales | 18171.2 |
| Z-TOTAL | Sales | 46722.3 |
Написать запросы с использованием UNION самостоятельно, а затем посмотреть решение
Пример 2. Данные — те же, что в примере 1, но задача немного посложнее. Требуется вывести в одной таблице не только индивидуальные размеры заработной платы, упорядоченные по должностям и суммарную заработную плату по должностям, но суммарную заработную плату по всем сотрудникам.
Пример 3. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), и Years (длительность трудового стажа).
| Name | Dept | Years |
| Sanders | 20 | 7 |
| Pernal | 20 | 8 |
| Marenghi | 38 | 5 |
| Doctor | 20 | 5 |
| Factor | 38 | 8 |
Вывести в одной таблице средний трудовой стаж по отделам и индивидуальные значения длительности трудового стажа сотрудников, сгруппированных по номерам отделов.
Другие случаи объединения запросов к одной таблице с помощью оператора SQL UNION
Пример 4. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос нужен для получения данных о сотрудниках, заработная плата которых более 21000:
Результатом выполнения запроса будет следующая таблица:
| ID | Name |
| 140 | Fraye |
| 160 | Molinare |
| 260 | Jones |
Второй запрос возвращает имена сотрудников, должность которых «менеждер», а число лет трудового стажа — менее 8:
Результатом выполнения запроса будет следующая таблица:
| ID | Name |
| 10 | Sanders |
| 30 | Marenghi |
| 100 | Plotz |
| 140 | Fraye |
| 160 | Molinare |
| 240 | Daniels |
Теперь требуются данные, в которых объединены критерии отбора, применённые в двух запросах. Объединяем запросы при помощи оператора UNION:
Результатом выполнения запроса с оператором UNION будет следующая таблица:
| ID | Name |
| 10 | Sanders |
| 30 | Marenghi |
| 100 | Plotz |
| 140 | Fraye |
| 160 | Molinare |
| 240 | Daniels |
| 260 | Jones |
Запрос с оператором UNION может возвращать и большее количество столбцов, важно, повторимся, чтобы в объединяемых запросах число столбцов, порядок их следования и типы данных совпадали.
Теперь работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке
Пример 5. Есть база данных портала объявлений.
Пусть сначала требуется получить данные о категориях и частях категорий объявлений, в которых подано более 100 объявлений в неделю. Пишем следующий запрос:
Результатом выполнения запроса будет следующая таблица:
| Category | Part | Units | Money |
| Транспорт | Автомашины | 110 | 17600 |
| Транспорт | Мотоциклы | 131 | 20960 |
| Электротехника | Телевизоры | 127 | 8255 |
| Электротехника | Холодильники | 137 | 8905 |
| Стройматериалы | Регипс | 112 | 11760 |
| Досуг | Музыка | 117 | 7605 |
Теперь требуется извлечь данные о категориях и частях категорий объявлений, за которые выручено более 10000 денежных единиц в неделю. Пишем следующий запрос:
Результатом выполнения запроса будет следующая таблица:
| Category | Part | Units | Money |
| Транспорт | Автомашины | 110 | 17600 |
| Недвижимость | Квартиры | 89 | 18690 |
| Недвижимость | Дачи | 57 | 11970 |
| Транспорт | Мотоциклы | 131 | 20960 |
| Стройматериалы | Регипс | 112 | 11760 |
Теперь требуется извлечь данные, которые соответствуют критериям и первого, и второго запросов. Объединяем запросы при помощи оператора UNION:
Результатом выполнения запроса будет следующая таблица:
| Транспорт | Автомашины | 110 | 17600 |
| Транспорт | Мотоциклы | 131 | 20960 |
| Недвижимость | Квартиры | 89 | 18690 |
| Недвижимость | Дачи | 57 | 11970 |
| Электротехника | Телевизоры | 127 | 8255 |
| Электротехника | Холодильники | 137 | 8905 |
| Стройматериалы | Регипс | 112 | 11760 |
| Досуг | Музыка | 117 | 7605 |
Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE, DELETE, HAVING.
How do I combine 2 select statements into one?
I have a table with lots of rows and columns of course 😛 Lets say it looks like this:
Now I want to create an advanced select statement that gives me this combined (pseudo SQLish here):
The output would be:
How would I combine those two select statements into one nice select statement?
Would it work if I complicated the SQL like below (because my own SQL statement contains an exists statement)? I just want to know how I can combine the selects and then try to apply it to my somewhat more advanced SQL.
My REAL SQL statement is this one:
which gives me a result. But I want to combine it with a copy of this select statement with an added AND on the end and the ‘Status’ field would be changed with a string like ‘DELETED’.
Оператор UNION в SQL
Оператор UNION в SQL выбирает строки из двух или более таблиц. Если строки в таблицах повторяются, то они выводятся только один раз (т.е. без дублей). Например:
Здесь мы извлекаем столбец age из таблиц Teachers и Students, игнорируя повторяющиеся строки.

Нюансы использования оператора UNION
Чтобы использовать оператор UNION в SQL, следует знать, что:
Количество столбцов во всех таблицах должно быть одинаковым. Например, в примере выше в таблицах Teachers и Students по три столбца.
Типы данных столбцов должны быть одинаковыми. Например, в примере выше столбец age в таблице Teachers является целочисленного типа данных, как и столбец age в таблице Students.
Столбцы должны находится в одинаковом порядке в каждой таблице. Например, в примере выше порядок столбцов в таблице Teachers — id-name-age, как и в таблице Students.
Оператор UNION ALL в SQL
Оператор UNION ALL выбирает строки из двух или более таблиц, подобно работе оператора UNION . Однако, в отличие от UNION , оператор UNION ALL не игнорирует повторяющиеся строки (т.е. выводит дубли).
Давайте попробуем выполнить предыдущую команду SQL, используя UNION ALL вместо UNION :
SQL UNION Operator
The UNION operator is used to combine the result-set of two or more SELECT statements.
- Every SELECT statement within UNION must have the same number of columns
- The columns must also have similar data types
- The columns in every SELECT statement must also be in the same order
UNION Syntax
UNION ALL Syntax
The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL :
Note: The column names in the result-set are usually equal to the column names in the first SELECT statement.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
Below is a selection from the «Customers» table:
And a selection from the «Suppliers» table:
| SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
| 2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
| 3 | Grandma Kelly’s Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
SQL UNION Example
The following SQL statement returns the cities (only distinct values) from both the «Customers» and the «Suppliers» table:
Example
Note: If some customers or suppliers have the same city, each city will only be listed once, because UNION selects only distinct values. Use UNION ALL to also select duplicate values!
SQL UNION ALL Example
The following SQL statement returns the cities (duplicate values also) from both the «Customers» and the «Suppliers» table:
Example
SQL UNION With WHERE
The following SQL statement returns the German cities (only distinct values) from both the «Customers» and the «Suppliers» table:
Example
SQL UNION ALL With WHERE
The following SQL statement returns the German cities (duplicate values also) from both the «Customers» and the «Suppliers» table:
Example
Another UNION Example
The following SQL statement lists all customers and suppliers:
Example
Notice the «AS Type» above — it is an alias. SQL Aliases are used to give a table or a column a temporary name. An alias only exists for the duration of the query. So, here we have created a temporary column named «Type», that list whether the contact person is a «Customer» or a «Supplier».