Результаты двух запросов можно объединить с помощью операций над множествами: объединения, пересечения и разности. Синтаксис:
query1UNION [ALL]запрос2query1INTERSECT [ALL]запрос2query1EXCEPT [ALL]запрос2
где query1 и
запрос2 — это запросы, в которых могут использоваться любые функции, рассмотренные до настоящего момента.
UNION фактически присоединяет результат
запрос2 к результату
query1 (хотя и нет гарантии, что строки будут фактически возвращены именно в таком порядке). Кроме того, оно исключает дубликаты строк из результата так же, как и DISTINCT, если не UNION ALL используется.
INTERSECT возвращает все строки, присутствующие в результатах обеих query1 так и в результате
запрос2. Дублирующиеся строки исключаются, за исключением случаев, когда INTERSECT ALL используется.
EXCEPT возвращает все строки, которые присутствуют в результате
query1 но отсутствующих в результате команды
запрос2. (Это иногда называют
разностью между двумя запросами.) Как и прежде, дубликаты
удаляются, если не указано EXCEPT ALL используется.
Для вычисления объединения, пересечения или разности двух запросов оба запроса должны быть «совместимыми по объединению», что означает, что они возвращают одинаковое число столбцов, а соответствующие столбцы имеют совместимые типы данных, как описано в Раздел 2.7.5.
Операции над множествами можно комбинировать, например
query1UNIONзапрос2EXCEPTquery3
что эквивалентно
(query1UNIONзапрос2) EXCEPTquery3
Как показано в данном примере, для управления порядком вычисления можно использовать скобки. Без скобок операторы UNION
и EXCEPT выполняются слева направо,
но INTERSECT имеет более высокий приоритет, чем эти два
оператора. Таким образом,
query1UNIONзапрос2INTERSECTquery3
означает
query1UNION (запрос2INTERSECTquery3)
Вы также можете заключить отдельную инструкцию запрос
в круглые скобки. Это важно, если
команда запрос должна использовать любое из предложений, рассматриваемых в следующих разделах, например LIMIT.
Без скобок возникнет синтаксическая ошибка либо предложение будет
интерпретировано как относящееся к результату операции над множествами, а не
к одному из ее операндов. Например,
SELECT a FROM b UNION SELECT x FROM y LIMIT 10
допускается, но это означает
(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10
а не
SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)