В одном запросе может быть использовано несколько операций над множествами строк. Для этого достаточно перечислить их друг за другом.
Рассмотрим пример. Есть три таблицы:
SELECT *
FROM table1
# | value |
---|---|
1 | 1 |
2 | 2 |
SELECT *
FROM table2
# | value |
---|---|
1 | 3 |
2 | 4 |
SELECT *
FROM table3
# | value |
---|---|
1 | 1 |
2 | 3 |
3 | 5 |
Объединим строки трех таблиц
SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT * FROM table3
ORDER BY value
# | value |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
В случае использования INTERSECT
и EXCEPT
становится важным порядок выполнения операций над множествами строк. По умолчанию запросы выполняются последовательно сверху вниз. В нашем примере сначала будут объединены строки table1
и table2
, затем к ним будут добавлены строки table3
.
Рассмотрим пример с EXCEPT
.
SELECT * FROM table1
UNION
SELECT * FROM table2
EXCEPT
SELECT * FROM table3
ORDER BY value
# | value |
---|---|
1 | 2 |
2 | 4 |
Сначала были объединены строки table1
и table2
. В результате получились строки со значениями 1, 2, 3, 4. Затем из этих строк были исключены строки table3
1, 3 и 5.
Порядок выполнения операций можно изменить с помощью скобок. Сначала исключим из table2
строки table3
, затем объединим результат со строками table1
.
SELECT * FROM table1
UNION
(
SELECT * FROM table2
EXCEPT
SELECT * FROM table3
)
ORDER BY value
# | value |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
Из table2
(3, 4) исключаем строки table3
(1, 3, 5). В результате остается строка со значением 4. Затем к строкам table1
(1, 2) добавляется строка со значением 4.