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)
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。