UNION
、INTERSECT
、EXCEPT
) #可使用集合操作并集、交集和差集合并两个查询的结果。语法为
query1
UNION [ALL]query2
query1
INTERSECT [ALL]query2
query1
EXCEPT [ALL]query2
其中 查询 1
和 查询 2
是可以使用到目前为止讨论过的任何要素的查询。
UNION
将 查询 2
的结果有效地附加到 查询 1
的结果(但无法保证这是实际返回行的顺序)。此外,它从结果中消除了重复行,就像 DISTINCT
一样,除非使用 UNION ALL
。
INTERSECT
返回 查询 1
和 查询 2
结果中同时存在的所有行。使用 INTERSECT ALL
之前将消除重复行。
EXCEPT
返回 查询 1
结果中存在但 查询 2
结果中不存在的所有行。(这有时称为两个查询之间的差。)同样,在未使用 EXCEPT ALL
之前也会消除重复项。
要计算两个查询的并集、交集或差值,则这两个查询必须 ““联合兼容””,这意味着它们返回的列数相同,且对应列的数据类型兼容,如 第 10.5 节 中所述。
集合运算可以组合,例如
query1
UNIONquery2
EXCEPTquery3
等同于
(query1
UNIONquery2
) EXCEPTquery3
如这里所示,可使用括号控制计算顺序。如果没有括号,UNION
和 EXCEPT
将自左向右关联,但 INTERSECT
比这两个运算符绑定得更紧密。因此
query1
UNIONquery2
INTERSECTquery3
表示
query1
UNION (query2
INTERSECTquery3
)
还可以用括号包围单个 查询
。如果 查询
需要使用后续部分中讨论的任何子句(如 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)