UNION, INTERSECT, EXCEPT) #可以使用集合操作 union、intersection 和 difference 来组合两个查询的结果。语法是
query1UNION [ALL]query2query1INTERSECT [ALL]query2query1EXCEPT [ALL]query2
其中 query1 和 query2 是可以使用到目前为止讨论的任何特性的查询。
UNION 有效地将 query2 的结果附加到 query1 的结果(尽管不能保证这是实际返回行的顺序)。此外,它会从结果中消除重复行,方式与 DISTINCT 相同,除非使用了 UNION ALL。
INTERSECT 返回既在 query1 的结果中又在 query2 的结果中的所有行。除非使用 INTERSECT ALL,否则将消除重复行。
EXCEPT 返回在 query1 的结果中但不在 query2 的结果中的所有行。(这有时被称为两个查询之间的差集。)同样,除非使用 EXCEPT ALL,否则将消除重复项。
为了计算两个查询的并集、交集或差集,这两个查询必须是“并集兼容的”,这意味着它们返回相同数量的列,并且相应的列具有兼容的数据类型,如第 10.5 节中所述。
集合操作可以组合,例如
query1UNIONquery2EXCEPTquery3
这等效于
(query1UNIONquery2) EXCEPTquery3
如此处所示,可以使用括号来控制评估顺序。如果没有括号,UNION 和 EXCEPT 从左到右关联,但 INTERSECT 比这两个运算符的绑定更紧密。因此
query1UNIONquery2INTERSECTquery3
表示
query1UNION (query2INTERSECTquery3)
你还可以用括号括起单个的 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)
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。