UNION
, INTERSECT
, EXCEPT
) #可以使用集合操作 union、intersection 和 difference 来组合两个查询的结果。语法如下:
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
。
为了计算两个查询的并集、交集或差集,这两个查询必须是 “并集兼容” 的,这意味着它们返回相同的列数,并且对应的列具有兼容的数据类型,如 第 10.5 节 中所述。
集合操作可以组合,例如
query1
UNIONquery2
EXCEPTquery3
这等效于
(query1
UNIONquery2
) EXCEPTquery3
如这里所示,可以使用括号来控制求值的顺序。在没有括号的情况下,UNION
和 EXCEPT
从左到右结合,但 INTERSECT
的结合优先级高于这两个运算符。因此
query1
UNIONquery2
INTERSECTquery3
意味着
query1
UNION (query2
INTERSECTquery3
)
您也可以用括号将单个 query
包围起来。如果 query
需要使用以下部分中讨论的任何子句(例如 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)
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。