支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

7.4. 组合查询 (UNION, INTERSECT, EXCEPT) #

可以使用集合操作 union、intersection 和 difference 来组合两个查询的结果。语法是

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

其中 query1query2 是可以使用到目前为止讨论的任何特性的查询。

UNION 有效地将 query2 的结果附加到 query1 的结果(尽管不能保证这是实际返回行的顺序)。此外,它会从结果中消除重复行,方式与 DISTINCT 相同,除非使用了 UNION ALL

INTERSECT 返回既在 query1 的结果中又在 query2 的结果中的所有行。除非使用 INTERSECT ALL,否则将消除重复行。

EXCEPT 返回在 query1 的结果中但不在 query2 的结果中的所有行。(这有时被称为两个查询之间的差集。)同样,除非使用 EXCEPT ALL,否则将消除重复项。

为了计算两个查询的并集、交集或差集,这两个查询必须是并集兼容的,这意味着它们返回相同数量的列,并且相应的列具有兼容的数据类型,如第 10.5 节中所述。

集合操作可以组合,例如

query1 UNION query2 EXCEPT query3

这等效于

(query1 UNION query2) EXCEPT query3

如此处所示,可以使用括号来控制评估顺序。如果没有括号,UNIONEXCEPT 从左到右关联,但 INTERSECT 比这两个运算符的绑定更紧密。因此

query1 UNION query2 INTERSECT query3

表示

query1 UNION (query2 INTERSECT query3)

你还可以用括号括起单个的 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)

提交更正

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