Результаты двух запросов могут быть объединены с помощью операций над множествами: объединение, пересечение и разность. Синтаксис

query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2

где query1и query2— запросы, которые могут использовать любые функции, обсуждавшиеся до этого момента.

UNIONэффективно добавляет результат query2к результату query1(хотя нет гарантии, что это именно тот порядок, в котором фактически возвращаются строки). Кроме того, он удаляет повторяющиеся строки из своего результата так же, как и DISTINCT, если только UNION ALLон не используется.

INTERSECTвозвращает все строки, которые есть как в результате, так query1и в результате query2. Повторяющиеся строки удаляются, если INTERSECT ALLне используются.

EXCEPTвозвращает все строки, которые есть в результате, query1но не в результате query2. (Это иногда называют разницей между двумя запросами.) Опять же, дубликаты исключаются, если они EXCEPT ALLне используются.

Чтобы вычислить объединение, пересечение или разность двух запросов, эти два запроса должны быть « совместимы по объединению » , что означает, что они возвращают одинаковое количество столбцов, а соответствующие столбцы имеют совместимые типы данных.

Операции над множествами можно комбинировать, например

query1 UNION query2 EXCEPT query3

что эквивалентно

(query1 UNION query2) EXCEPT query3

Как показано здесь, вы можете использовать круглые скобки для управления порядком оценки. Без круглых скобок UNIONи EXCEPTассоциации слева направо, но INTERSECTсвязывает более тесно, чем эти два оператора. Таким образом

query1 UNION query2 INTERSECT query3

означает

query1 UNION (query2 INTERSECT query3)

Вы также можете окружить человека queryскобками. Это важно, если queryнеобходимо использовать какие-либо из предложений, обсуждаемых в следующих разделах, таких как LIMIT. Без круглых скобок вы получите синтаксическую ошибку, иначе предложение будет пониматься как относящееся к выходу операции set, а не к одному из ее входов. Например,

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)