在集合論中,兩個集合(集合A和集合B)的並集是一個包含集合A和B中所有元素的集合。換句話說,如果一個元素屬於任何一個輸入集合,那么它也屬於結果集。如圖所示。
對於集合運算,需要注意以下幾點:
- 參與集合運算的兩個查詢生成的結果集必須包含相同的列數,並且相應列必須具有兼容的數據類型。
- 集合運算結果中的列名由第一個查詢決定,因此,如果要為結果列分配別名,應該在第一個查詢中分配相應的別名。
- 集合運算對行進行比較時,認為兩個NULL值相等。
UNION集合運算分為UNION ALL和UNION DISTINCT兩種情形,它們的區別是UNION ALL會保留重復行,而UNION DISTINCT會刪除重復行。下面用例子來說明。
UNION ALL
UNION ALL合並兩個集合,並保留重復行。關於UNION ALL需要注意以下幾點:
- UNION ALL實際上不會對行進行比較,也不會刪除重復行,它只是做個合並的操作而已。
- 因為UNION ALL不會刪除重復行,所以它的結果是多集,而不是真正的集合,因為相同的行在結果中可能出現多次。
例如。
SQL查詢代碼:
USE TSQLFundamentals2008; GO -- UNION ALL合並兩個集合,並保留重復行 SELECT country,region,city FROM HR.Employees UNION ALL SELECT country,region,city FROM Sales.Customers
查詢結果:
UNION DISTINCT
UNION DISTINCT會合並兩個集合,但是它會刪除重復行。對於UNION DISTINCT需要注意以下幾點:
- 從處理過程來看,UNION DISTINCT先合並多個集合為多集,再刪除重復行變成集合。
- 從運算結果來看,UNION DISTINCT是一個真正的集合,而不是多集。
例如。
SQL查詢代碼:
USE TSQLFundamentals2008; GO -- UNION(隱含DISTINCT)合並兩個集合,但會刪除重復行 SELECT country,region,city FROM HR.Employees UNION SELECT country,region,city FROM Sales.Customers
查詢結果:
注意:比上面的查詢少了29條記錄,當然這些記錄都是因為重復行被刪除了。