2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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)

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。