# 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)