В одном запросе может быть использовано несколько операций над множествами строк. Для этого достаточно перечислить их друг за другом.

Рассмотрим пример. Есть три таблицы:

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.

5.7 Сортировка

6.1 Подзапрос одиночной строки