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)
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。