MSSQL內(nèi)外連接(INNER JOIN)語(yǔ)句詳解
在之前,我對(duì)MSSQL中的內(nèi)連接和外連接所得出的數(shù)據(jù)集不是很清楚。這幾天重新溫習(xí)了一下SQL的書(shū)本,現(xiàn)在的思路應(yīng)該是很清楚了,現(xiàn)在把自己的理解發(fā)出來(lái)給大家溫習(xí)下。希望和我一樣對(duì)SQL的連接語(yǔ)句不太理解的朋友能夠有所幫助。(發(fā)這么菜的教程,各位大大們別笑話偶了,呵:D )
有兩個(gè)表A和表B。
表A結(jié)構(gòu)如下:
Aid:int;標(biāo)識(shí)種子,主鍵,自增ID
Aname:varchar
數(shù)據(jù)情況,即用select * from A出來(lái)的記錄情況如下圖1所示:
圖1:A表數(shù)據(jù)
表B結(jié)構(gòu)如下:
Bid:int;標(biāo)識(shí)種子,主鍵,自增ID
Bnameid:int
數(shù)據(jù)情況,即用select * from B出來(lái)的記錄情況如下圖2所示:
圖2:B表數(shù)據(jù)
為了把Bid和Aid加以區(qū)分,不讓大家有誤解,所以把Bid的起始種子設(shè)置為100。
有SQL基本知識(shí)的人都知道,兩個(gè)表要做連接,就必須有個(gè)連接字段,從上表中的數(shù)據(jù)可以看出,在A表中的Aid和B表中的Bnameid就是兩個(gè)連接字段。
下圖3說(shuō)明了連接的所有記錄集之間的關(guān)系:
現(xiàn)在我們對(duì)內(nèi)連接和外連接一一講解。
1.內(nèi)連接:利用內(nèi)連接可獲取兩表的公共部分的記錄,即圖3的記錄集C
語(yǔ)句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
運(yùn)行結(jié)果如下圖4所示:
圖4:內(nèi)連接數(shù)據(jù)
其實(shí)select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運(yùn)行結(jié)果是一樣的。
2.外連接:外連接分為兩種,一種是左連接(Left JOIN)和右連接(Right JOIN)
(1)左連接(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。
語(yǔ)句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
運(yùn)行結(jié)果如下圖5所示:
圖5:左連接數(shù)據(jù)
說(shuō)明:
在語(yǔ)句中,A在B的左邊,并且是Left Join,所以其運(yùn)算方式為:A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1
在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8
圖1中即表A所有記錄集A中存在的Aid為:1 2 3 4 5 6 7 8 9
表A記錄集A1中存在的Aid=(圖1中即A表中所有Aid)-(圖3中即記錄集C中存在的Aid),最終得出為:1 4 5 9
由此得出圖5中A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1,
最終得出的結(jié)果圖5中可以看出Bnameid及Bid非NULL的記錄都為圖3公共部分記錄集C中的記錄;Bnameid及Bid為NULL的Aid為1 4 5 9的四筆記錄就是表A記錄集A1中存在的Aid。
(2)右連接(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。
語(yǔ)句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
運(yùn)行結(jié)果如下圖6所示:
圖6:右連接數(shù)據(jù)
說(shuō)明:
在語(yǔ)句中,A在B的左邊,并且是Right Join,所以其運(yùn)算方式為:A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1
在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8
圖2中即表B所有記錄集B中存在的Bnameid為:2 3 6 7 8 11
表B記錄集B1中存在的Bnameid=(圖2中即B表中所有Bnameid)-(圖3中即記錄集C中存在的Aid),最終得出為:11
由此得出圖6中A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1,
最終得出的結(jié)果圖6中可以看出Aid及Aname非NULL的記錄都為圖3公共部分記錄集C中的記錄;Aid及Aname為NULL的Aid為11的記錄就是表B記錄集B1中存在的Bnameid。
總結(jié):
通過(guò)上面的運(yùn)算解說(shuō),相信很多人已經(jīng)想到,上面的情況(包括圖3的關(guān)系圖)說(shuō)明的都只是A在B的左邊的情況,
以下語(yǔ)句B在A的右邊的又會(huì)出現(xiàn)什么情況呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid
其實(shí)對(duì)圖3左右翻轉(zhuǎn)一下就可以得出以下結(jié)論:
select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的記錄集是一樣的
而
select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的記錄集也是一樣的。
第一次寫(xiě)類似教程的貼子,希望和我一樣對(duì)SQL的連接語(yǔ)句不太理解的朋友能夠有所幫助。謝謝大家支持。
- SQL中INNER JOIN的實(shí)現(xiàn)
- MySQL INNER JOIN 的底層實(shí)現(xiàn)原理分析
- MySQL中的 inner join 和 left join的區(qū)別解析(小結(jié)果集驅(qū)動(dòng)大結(jié)果集)
- SQL聯(lián)合查詢inner join、outer join和cross join的區(qū)別詳解
- Mysql inner join on的用法實(shí)例(必看)
- SQL之left join、right join、inner join的區(qū)別淺析
- MySQL中視圖的使用及多表INNER JOIN的技巧分享
- MYSQL使用inner join 進(jìn)行 查詢/刪除/修改示例
- 超詳細(xì)mysql left join,right join,inner join用法分析
- SQL中的INNER JOIN操作方法
相關(guān)文章
sql處理數(shù)據(jù)庫(kù)鎖的存儲(chǔ)過(guò)程分享
查看當(dāng)前進(jìn)程,或死鎖進(jìn)程,并能自動(dòng)殺掉死進(jìn)程,因?yàn)槭轻槍?duì)死的,所以如果有死鎖進(jìn)程,只能查看死鎖進(jìn)程,當(dāng)然,你可以通過(guò)參數(shù)控制,不管有沒(méi)有死鎖,都只查看死鎖進(jìn)程2012-11-11解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Key Lookup)
本文主要講解索引性能優(yōu)化,著重對(duì)Bookmark Lookup、RID Lookup、Key Lookup三者進(jìn)行移除的實(shí)現(xiàn)進(jìn)行解析,以此來(lái)提高查詢性能。希望對(duì)大家有所幫助2016-12-12數(shù)據(jù)庫(kù)觸發(fā)器DB2和SqlServer有哪些區(qū)別
大部分?jǐn)?shù)據(jù)庫(kù)語(yǔ)句的基本語(yǔ)法是相同的,但具體到的每一種數(shù)據(jù)庫(kù),又有些不一樣,例如觸發(fā)器,DB2和SQL Server兩種很大的不同。對(duì)數(shù)據(jù)庫(kù)觸發(fā)器DB2和SqlServer有哪些區(qū)別感興趣的朋友一起看看本文吧2015-11-11SQL注入之sqlmap入門(mén)學(xué)習(xí)
本文主要介紹了SQL注入之sqlmap入門(mén)學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05配置Windows防火墻允許SQL?Server遠(yuǎn)程連接的實(shí)現(xiàn)
防火墻系統(tǒng)有助于阻止對(duì)計(jì)算機(jī)資源進(jìn)行未經(jīng)授權(quán)的訪問(wèn),?如果防火墻已打開(kāi)但卻未正確配置,則可能會(huì)阻止連接SQL,本文主要介紹了配置Windows防火墻允許SQL?Server遠(yuǎn)程連接的實(shí)現(xiàn),感興趣的可以了解一下2024-04-04用SQL語(yǔ)句實(shí)現(xiàn)隨機(jī)查詢數(shù)據(jù)并不顯示錯(cuò)誤數(shù)據(jù)的方法
用SQL語(yǔ)句實(shí)現(xiàn)隨機(jī)查詢數(shù)據(jù)并不顯示錯(cuò)誤數(shù)據(jù)的方法...2007-11-11SQLSERVER中得到執(zhí)行計(jì)劃的兩種方式
得到執(zhí)行計(jì)劃的方式有兩種:一種是在指令的前面打開(kāi)一些開(kāi)關(guān),讓執(zhí)行計(jì)劃信息打在結(jié)果集里,這種方法比較適合在一個(gè)測(cè)試環(huán)境里對(duì)單個(gè)語(yǔ)句調(diào)優(yōu);另一種方法是使用SQL Trace里的事件跟蹤來(lái)跟蹤語(yǔ)句的執(zhí)行計(jì)劃,感興趣的朋友可以了解下2013-01-01SQLserver2019?Express安裝及其一些問(wèn)題解決
本文主要介紹了SQL?server?2019?Express?安裝及其一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04