Результаты двух запросов могут быть объединены с помощью операций над множествами: объединение, пересечение и разность. Синтаксис
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)
0 комментариев