Объединение
Для объединения запросов используется служебное слово 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;
[[ column ]] |
---|
[[ value ]] |
model | Price |
---|---|
1750 | 1200 |
1752 | 1150 |
1298 | 1050 |
1233 | 980 |
1321 | 970 |
1233 | 950 |
1121 | 850 |
1298 | 700 |
1232 | 600 |
1233 | 600 |
1232 | 400 |
1232 | 350 |
1260 | 350 |
Пример 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;
[[ column ]] |
---|
[[ value ]] |
Type | Model | price |
---|---|---|
Laptop | 1750 | 1200 |
Laptop | 1752 | 1150 |
Laptop | 1298 | 1050 |
PC | 1233 | 980 |
Laptop | 1321 | 970 |
PC | 1233 | 950 |
PC | 1121 | 850 |
Laptop | 1298 | 700 |
PC | 1232 | 600 |
PC | 1233 | 600 |
PC | 1232 | 400 |
PC | 1232 | 350 |
PC | 1260 | 350 |
Рекомендуемые упражнения: 7, 24, 26, 29, 30, 32, 36, 37, 41, 43, 44, 45, 48, 49, 51, 54, 56, 57, 102, 113, 131
Рассмотрим следующую задачу.
В базе имеется один ноутбук и три ПК от производителя 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';
[[ column ]] |
---|
[[ value ]] |
model | type |
---|---|
1121 | PC |
1121 | PC |
1121 | PC |
1750 | Laptop |
А если - 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';
[[ column ]] |
---|
[[ value ]] |
model | type |
---|---|
1121 | PC |
1750 | Laptop |
Решение на основе UNION соответствует несколько иной задаче, которую можно было бы сформулировать следующим образом.