爲何使用集合運算:函數
在集合運算中比聯接查詢和EXISTS/NOT EXISTS更方便。spa
並集:兩個集合的並集是一個包含集合A和B中全部元素的集合。code
在T-SQL中。UNION集合運算能夠將兩個輸入查詢的結果組合成一個結果集。須要注意的是:若是一個行在任何一個輸入集合中出現,它也會在UNION運算的結果中出現。T-SQL支持如下兩種選項:blog
(1)UNION ALL:不會刪除重複行排序
-- union all select country, region, city from hr.Employees union all select country, region, city from sales.Customers;
(2)UNION:會刪除重複行ci
-- union select country, region from hr.Employees union select country, region from sales.Customers;
交集:兩個集合(記爲集合A和集合B)的交集是由既屬於A,也屬於B的全部元素組成的集合。it
在T-SQL中,INTERSECT集合運算對兩個輸入查詢的結果取其交集,只返回在兩個查詢結果集中都出現的行。io
INTERSECT集合運算在邏輯上會首先刪除兩個輸入集中的重複行,而後返回只在兩個集合中中都出現的行。換句話說:若是一個行在兩個輸入集中都至少出現一次,那麼交集返回的結果中將包含這一行。class
例如,下面返回既是僱員地址,又是客戶地址的不一樣地址:date
-- intersect select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
這裏須要說的是,集合運算對行進行比較時,認爲兩個NULL值相等,因此就返回該行記錄。
差集:兩個集合(記爲集合A和集合B)的由屬於集合A,但不屬於集合B的全部元素組成的集合。
在T-SQL中,集合之差使用EXCEPT集合運算實現的。它對兩個輸入查詢的結果集進行操做,反會出如今第一個結果集中,但不出如今第二個結果集中的全部行。
EXCEPT結合運算在邏輯上首先刪除兩個輸入集中的重複行,而後返回只在第一個集合中出現,在第二個結果集中不出現的全部行。換句話說:一個行可以被返回,僅當這個行在第一個輸入的集合中至少出現過一次,並且在第二個集合中一次也沒出現過。
此外,相比UNION和INTERSECT,兩個輸入集合的順序是會影響到最後返回結果的。
例如,藉助EXCEPT運算,咱們能夠方便地實現屬於A但不屬於B的場景,下面返回屬於員工抵制,但不屬於客戶地址的地址記錄:
-- except select country, region, city from hr.Employees except select country, region, city from sales.Customers;
SQL定義了集合運算之間的優先級:INTERSECT最高,UNION和EXCEPT相等。
換句話說:首先會計算INTERSECT,而後按照從左至右的出現順序依次處理優先級相同的運算。
-- 集合運算的優先級 select country, region, city from Production.Suppliers except select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
上面這段SQL代碼,由於INTERSECT優先級比EXCEPT高,因此首先進行INTERSECT交集運算。所以,這個查詢的含義是:返回沒有出如今員工地址和客戶地址交集中的供應商地址。
集合運算的優先級
1.INTERSECT>UNION=EXCEPT
2.首先計算INTERSECT,而後從左到右的出現順序依次處理優先級的相同的運算。
3.可使用圓括號控制集合運算的優先級,它具備最高的優先級。
在排序函數的OVER字句中使用 ORDER BY ( SELECT <常量> )能夠告訴SQL Server沒必要在乎行的順序。
集合運算查詢自己並不持之除ORDER BY意外的其餘邏輯查詢處理階段,但能夠經過表表達式來避開這一限制。
解決方案就是:首先根據包含集合運算的查詢定義一個表表達式,而後在外部查詢中對錶表達式應用任何須要的邏輯查詢處理。
(1)例如,下面的查詢返回每一個國家中不一樣的員工地址或客戶地址的數量:
select country, COUNT(*) as numlocations from (select country, region, city from hr.Employees union select country, region, city from sales.Customers) as U group by country;
(2)例如,下面的查詢返回由員工地址爲3或5的員工最近處理過的兩個訂單:、
select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=3 order by orderdate desc,orderid desc) as D1 union all select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=5 order by orderdate desc,orderid desc) as D2;