1.5组合查询

115 阅读2分钟

7.4. 组合查询

可以使用集合运算联合、交集和差分组合两个查询的结果。语法是

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

其中 query1 和 query2 是可以使用到目前为止讨论的任何功能的查询。

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

INTERSECT返回查询 1 的结果和*查询 2* 的结果中的所有行。除非使用,否则将消除重复的行。INTERSECT ALL

EXCEPT返回查询 1 结果中但不在*查询 2* 结果中的所有行。(这有时称为两个查询之间的差异。 同样,除非使用,否则会消除重复项。EXCEPT ALL

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

集合操作可以组合,例如

query1 UNION query2 EXCEPT query3

相当于

(query1 UNION query2) EXCEPT query3

如此处所示,您可以使用括号来控制计算顺序。没有括号,并且从左到右关联,但比这两个运算符绑定得更紧密。因此UNION``EXCEPT``INTERSECT

query1 UNION query2 INTERSECT query3

方法

query1 UNION (query2 INTERSECT query3)

还可以用括号将单个*查询括起来。如果查询*需要使用以下各节中讨论的任何子句,例如 。如果没有括号,你将得到语法错误,否则子句将被理解为应用于 set 操作的输出,而不是其输入之一。例如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)