Объединение

Для объединения запросов используется служебное слово UNION:

<запрос 1>
UNION [ALL]
<запрос 2>

Предложение UNION приводит к появлению в результирующем наборе всех строк каждого из запросов. При этом, если определен параметр ALL, то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе присутствуют только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно задавать порядок объединения.

Операция объединения может быть выполнена только при выполнении следующих условий:

  • количество выходных столбцов каждого из запросов должно быть одинаковым;
  • выходные столбцы каждого из запросов должны быть совместимы между собой (в порядке их следования) по типам данных;
  • в результирующем наборе используются имена столбцов, заданные в первом запросе;
  • предложение ORDER BY применяется к результату объединения, поэтому оно может быть указано только в конце всего составного запроса.

Пример 5.7.1

Вывести номера моделей и цены ПК и ноутбуков в порядке убывание цены:
SELECT model, price
FROM PC
UNION
SELECT model, price
FROM Laptop
ORDER BY price DESC;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
modelPrice
17501200
17521150
12981050
1233980
1321970
1233950
1121850
1298700
1232600
1233600
1232400
1232350
1260350

Пример 5.7.2

Найти тип продукции, номер модели и цену ПК и ноутбуков:
SELECT Product.type, PC.model, price
FROM PC 
    INNER JOIN Product ON PC.model = Product.model
UNION
SELECT Product.type, Laptop.model, price
FROM Laptop 
    INNER JOIN Product ON Laptop.model = Product.model
ORDER BY price DESC;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
TypeModelprice
Laptop17501200
Laptop17521150
Laptop12981050
PC1233980
Laptop1321970
PC1233950
PC1121850
Laptop1298700
PC1232600
PC1233600
PC1232400
PC1232350
PC1260350

Рекомендуемые упражнения: 7, 24, 26, 29, 30, 32, 36, 37, 41, 43, 44, 45, 48, 49, 51, 54, 56, 57, 102, 113, 131

Рассмотрим следующую задачу.

Найти все имеющиеся единицы продукции производителя ‘B’. Вывести номер модели и тип.

В базе имеется один ноутбук и три ПК от производителя B, при этом все три ПК - одной модели.

Если мы будем использовать объединение с помощью UNION ALL, то мы получим все эти изделия.

select p.model, p.type from pc join Product p on PC.model=p.model where maker='B'
UNION ALL
select p.model, p.type from printer pr join Product p on pr.model=p.model where maker='B'
UNION ALL
select p.model, p.type from laptop lp join Product p on lp.model=p.model where maker='B';
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
modeltype
1121PC
1121PC
1121PC
1750Laptop

А если - UNION, то из результата будут исключены дубликаты строк:

select p.model, p.type from pc join Product p on PC.model=p.model where maker='B'
UNION
select p.model, p.type from printer pr join Product p on pr.model=p.model where maker='B'
UNION
select p.model, p.type from laptop lp join Product p on lp.model=p.model where maker='B';
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
modeltype
1121PC
1750Laptop

Решение на основе UNION соответствует несколько иной задаче, которую можно было бы сформулировать следующим образом.

Выяснить, какие модели производителя ‘B’ имеются в наличии. Вывести номер модели и тип.