Skip to content

7.4. 合并查询(UNIONINTERSECTEXCEPT#

可以使用集合运算联合、交集和差集来合并两个查询的结果。语法为

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)