sql server 交集,差集的用法詳解
概述
為什么使用集合運(yùn)算:
在集合運(yùn)算中比聯(lián)接查詢和EXISTS/NOT EXISTS更方便。
并集運(yùn)算(UNION)
并集:兩個(gè)集合的并集是一個(gè)包含集合A和B中所有元素的集合。
在T-SQL中。UNION集合運(yùn)算可以將兩個(gè)輸入查詢的結(jié)果組合成一個(gè)結(jié)果集。需要注意的是:如果一個(gè)行在任何一個(gè)輸入集合中出現(xiàn),它也會(huì)在UNION運(yùn)算的結(jié)果中出現(xiàn)。T-SQL支持以下兩種選項(xiàng):
(1)UNION ALL:不會(huì)刪除重復(fù)行
-- union allselect country, region, city from hr.Employees union all select country, region, city from sales.Customers;
(2)UNION:會(huì)刪除重復(fù)行
-- union select country, region from hr.Employees union select country, region from sales.Customers;
交集運(yùn)算(INTERSECT)
交集:兩個(gè)集合(記為集合A和集合B)的交集是由既屬于A,也屬于B的所有元素組成的集合。
在T-SQL中,INTERSECT集合運(yùn)算對(duì)兩個(gè)輸入查詢的結(jié)果取其交集,只返回在兩個(gè)查詢結(jié)果集中都出現(xiàn)的行。
INTERSECT集合運(yùn)算在邏輯上會(huì)首先刪除兩個(gè)輸入集中的重復(fù)行,然后返回只在兩個(gè)集合中中都出現(xiàn)的行。換句話說:如果一個(gè)行在兩個(gè)輸入集中都至少出現(xiàn)一次,那么交集返回的結(jié)果中將包含這一行。
例如,下面返回既是雇員地址,又是客戶地址的不同地址:
-- intersect select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
這里需要說的是,集合運(yùn)算對(duì)行進(jìn)行比較時(shí),認(rèn)為兩個(gè)NULL值相等,所以就返回該行記錄。
差集運(yùn)算(EXCEPT)
差集:兩個(gè)集合(記為集合A和集合B)的由屬于集合A,但不屬于集合B的所有元素組成的集合。
在T-SQL中,集合之差使用EXCEPT集合運(yùn)算實(shí)現(xiàn)的。它對(duì)兩個(gè)輸入查詢的結(jié)果集進(jìn)行操作,反會(huì)出現(xiàn)在第一個(gè)結(jié)果集中,但不出現(xiàn)在第二個(gè)結(jié)果集中的所有行。
EXCEPT結(jié)合運(yùn)算在邏輯上首先刪除兩個(gè)輸入集中的重復(fù)行,然后返回只在第一個(gè)集合中出現(xiàn),在第二個(gè)結(jié)果集中不出現(xiàn)的所有行。換句話說:一個(gè)行能夠被返回,僅當(dāng)這個(gè)行在第一個(gè)輸入的集合中至少出現(xiàn)過一次,而且在第二個(gè)集合中一次也沒出現(xiàn)過。
此外,相比UNION和INTERSECT,兩個(gè)輸入集合的順序是會(huì)影響到最后返回結(jié)果的。
例如,借助EXCEPT運(yùn)算,我們可以方便地實(shí)現(xiàn)屬于A但不屬于B的場(chǎng)景,下面返回屬于員工抵制,但不屬于客戶地址的地址記錄:
-- except select country, region, city from hr.Employees except select country, region, city from sales.Customers;
集合運(yùn)算優(yōu)先級(jí)
SQL定義了集合運(yùn)算之間的優(yōu)先級(jí):INTERSECT最高,UNION和EXCEPT相等。
換句話說:首先會(huì)計(jì)算INTERSECT,然后按照從左至右的出現(xiàn)順序依次處理優(yōu)先級(jí)相同的運(yùn)算。
-- 集合運(yùn)算的優(yōu)先級(jí) select country, region, city from Production.Suppliers except select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
上面這段SQL代碼,因?yàn)镮NTERSECT優(yōu)先級(jí)比EXCEPT高,所以首先進(jìn)行INTERSECT交集運(yùn)算。因此,這個(gè)查詢的含義是:返回沒有出現(xiàn)在員工地址和客戶地址交集中的供應(yīng)商地址。
集合運(yùn)算的優(yōu)先級(jí)
1.INTERSECT>UNION=EXCEPT
2.首先計(jì)算INTERSECT,然后從左到右的出現(xiàn)順序依次處理優(yōu)先級(jí)的相同的運(yùn)算。
3.可以使用圓括號(hào)控制集合運(yùn)算的優(yōu)先級(jí),它具有最高的優(yōu)先級(jí)。
在排序函數(shù)的OVER字句中使用ORDER BY ( SELECT <常量> )可以告訴SQL Server不必在意行的順序。
使用表表達(dá)式避開不支持的邏輯查詢處理
集合運(yùn)算查詢本身并不持之除ORDER BY意外的其他邏輯查詢處理階段,但可以通過表表達(dá)式來避開這一限制。
解決方案就是:首先根據(jù)包含集合運(yùn)算的查詢定義一個(gè)表表達(dá)式,然后在外部查詢中對(duì)表表達(dá)式應(yīng)用任何需要的邏輯查詢處理。
(1)例如,下面的查詢返回每個(gè)國(guó)家中不同的員工地址或客戶地址的數(shù)量:
select country, COUNT(*) as numlocations from (select country, region, city from hr.Employees union select country, region, city from sales.Customers) as Ugroup by country;
(2)例如,下面的查詢返回由員工地址為3或5的員工最近處理過的兩個(gè)訂單:、
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;
到此這篇關(guān)于sql server 交集,差集的用法詳解的文章就介紹到這了,更多相關(guān)sql server 交集,差集 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server遠(yuǎn)程定時(shí)備份數(shù)據(jù)庫腳本分享
這篇文章主要介紹了SQL Server遠(yuǎn)程定時(shí)備份數(shù)據(jù)庫腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02sql server的一個(gè)有趣的bit位運(yùn)算分享
sql server中沒有bool類型,而是用bit類型來表示bool值,估計(jì)是為了節(jié)省存儲(chǔ)空間,下面為大家介紹下這個(gè)有趣的bit位運(yùn)算,感興趣的朋友可以參考下2013-09-09sql server獲得新記錄標(biāo)識(shí)列值的二種方法
有時(shí)開發(fā)需要我們需把新插入的記錄之后立即返回插入記錄的ID哦,下面給大家介紹mssqlserver返回新添加的記錄的標(biāo)識(shí)列的值sql語句2013-11-11Sqlserver中char,nchar,varchar與Nvarchar的區(qū)別分析
Sqlserver中char,nchar,varchar與Nvarchar的區(qū)別分析,使用sqlserver的朋友可以參考下。2011-08-08mssql server 2012(SQL2012)各版本功能對(duì)比
今天裝了操作系統(tǒng)2012,也順便搞下SQL 2012看了下版本,選擇了自己的版本,也特留下版本對(duì)比供后來人參考2013-04-04SQL數(shù)據(jù)庫連接超時(shí)時(shí)間已到的問題
這篇文章主要介紹了SQL數(shù)據(jù)庫連接超時(shí)時(shí)間已到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04SQL Server 提取數(shù)字、提取英文、提取中文的sql語句
這篇文章主要介紹了SQL Server 提取數(shù)字、提取英文、提取中文 ,需要的朋友可以參考下2014-10-10MSSQL 監(jiān)控?cái)?shù)據(jù)/日志文件增長(zhǎng)實(shí)現(xiàn)方法
今天就想實(shí)現(xiàn)這么一個(gè)功能,每天(頻率可以調(diào)整)去收集一下數(shù)據(jù)文件的信息,放到一個(gè)表里面,這樣方便我們分析數(shù)據(jù)文件的增長(zhǎng)演變例程,甚至你可以將數(shù)據(jù)文件的增長(zhǎng)幅度和業(yè)務(wù)變化關(guān)聯(lián)起來分析2013-08-08