# 7.4.组合查询(协会,横断,除了)

两个查询的结果可以使用集合运算“并集”、“交集”和“差集”进行组合。语法是

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

哪里*问题1问题2*是可以使用到目前为止讨论的任何功能的查询。

协会有效地附加*问题2由于问题1*(尽管不能保证这是实际返回行的顺序)。此外,它从结果中消除重复行,方法与不同的除非联合所有被使用了。

横断返回结果中的所有行*问题1由于问题2*.除非交叉所有被使用了。

除了返回结果中的所有行*问题1但不是因为问题2(这有时被称为差别*在两个查询之间。)同样,除非除了所有被使用了。

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

可以组合集合操作,例如

query1 UNION query2 EXCEPT query3

这相当于

(query1 UNION query2) EXCEPT query3

如此处所示,您可以使用括号来控制评估的顺序。没有括号,联盟除了从左到右关联,但是相交比这两个运算符绑定得更紧密。因此

query1 UNION query2 INTERSECT query3

方法

query1 UNION (query2 INTERSECT query3)

你也可以围绕一个人*询问带括号。这很重要,如果询问*需要使用以下章节中讨论的任何条款,例如限制.如果没有括号,您将收到语法错误,否则该子句将被理解为应用于 set 操作的输出而不是其输入之一。例如,

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)