UNION
, INTERSECT
, EXCEPT
) #可以使用集合操作 union、intersection 和 difference 來合併兩個查詢的結果。語法如下:
query1
UNION [ALL]query2
query1
INTERSECT [ALL]query2
query1
EXCEPT [ALL]query2
其中 query1
和 query2
是可以利用到目前為止討論過的任何特性的查詢。
UNION
會將 query2
的結果附加到 query1
的結果之後(儘管不保證行實際返回的順序)。此外,它會從結果中刪除重複行,方式與 DISTINCT
相同,除非使用了 UNION ALL
。
INTERSECT
返回 query1
的結果集和 query2
的結果集中都存在的行。除非使用了 INTERSECT ALL
,否則會刪除重複行。
EXCEPT
返回 query1
的結果集中存在但 query2
的結果集中不存在的行。(有時也稱為兩個查詢的差集。)同樣,除非使用了 EXCEPT ALL
,否則會刪除重複行。
為了計算兩個查詢的 union、intersection 或 difference,這兩個查詢必須是“union 相容”,這意味著它們返回的列數相同,並且對應列的資料型別相容,具體描述參見10.5 節。
集合操作可以合併,例如:
query1
UNIONquery2
EXCEPTquery3
這等同於:
(query1
UNIONquery2
) EXCEPTquery3
如這裡所示,您可以使用括號來控制求值順序。沒有括號時,UNION
和 EXCEPT
是從左到右結合的,但 INTERSECT
的優先順序高於這兩個運算子。因此:
query1
UNIONquery2
INTERSECTquery3
意味著:
query1
UNION (query2
INTERSECTquery3
)
您也可以用括號將單個 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)
如果您在文件中發現任何不正確、不符合您對特定功能的體驗或需要進一步闡明的內容,請使用此表格報告文件問題。