В одном запросе может быть использовано несколько операций над множествами строк. Для этого достаточно перечислить их друг за другом.
Рассмотрим пример. Есть три таблицы:
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.