一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - MSSQL內外連接(INNER JOIN)語句詳解

MSSQL內外連接(INNER JOIN)語句詳解

2019-10-23 14:41mssql教程網 Sql Server

在之前,我對MSSQL中的內連接和外連接所得出的數據集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫

在之前,我對MSSQL中的內連接和外連接所得出的數據集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助。(發這么菜的教程,各位大大們別笑話偶了,呵:D )

有兩個表A和表B。
表A結構如下:
Aid:int;標識種子,主鍵,自增ID
Aname:varchar

數據情況,即用select * from A出來的記錄情況如下圖1所示:
MSSQL內外連接(INNER JOIN)語句詳解

圖1:A表數據

表B結構如下:
Bid:int;標識種子,主鍵,自增ID
Bnameid:int

數據情況,即用select * from B出來的記錄情況如下圖2所示:

MSSQL內外連接(INNER JOIN)語句詳解

圖2:B表數據

為了把Bid和Aid加以區分,不讓大家有誤解,所以把Bid的起始種子設置為100。
有SQL基本知識的人都知道,兩個表要做連接,就必須有個連接字段,從上表中的數據可以看出,在A表中的Aid和B表中的Bnameid就是兩個連接字段。
下圖3說明了連接的所有記錄集之間的關系:

MSSQL內外連接(INNER JOIN)語句詳解

圖3:連接關系圖

現在我們對內連接和外連接一一講解。
1.內連接:利用內連接可獲取兩表的公共部分的記錄,即圖3的記錄集C
語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
運行結果如下圖4所示:

MSSQL內外連接(INNER JOIN)語句詳解

圖4:內連接數據

其實select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運行結果是一樣的。
2.外連接:外連接分為兩種,一種是左連接(Left JOIN)和右連接(Right JOIN)
  (1)左連接(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。     
     語句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
     運行結果如下圖5所示:

MSSQL內外連接(INNER JOIN)語句詳解

圖5:左連接數據

     說明:
           在語句中,A在B的左邊,并且是Left Join,所以其運算方式為: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,
           最終得出的結果圖5中可以看出Bnameid及Bid非NULL的記錄都為圖3公共部分記錄集C中的記錄;Bnameid及Bid為NULL的Aid為1 4 5 9的四筆記錄就是表A記錄集A1中存在的Aid。

  (2)右連接(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。
     語句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
     運行結果如下圖6所示:

MSSQL內外連接(INNER JOIN)語句詳解

圖6:右連接數據

     說明:
           在語句中,A在B的左邊,并且是Right Join,所以其運算方式為: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,
           最終得出的結果圖6中可以看出Aid及Aname非NULL的記錄都為圖3公共部分記錄集C中的記錄;Aid及Aname為NULL的Aid為11的記錄就是表B記錄集B1中存在的Bnameid。

總結:

通過上面的運算解說,相信很多人已經想到,上面的情況(包括圖3的關系圖)說明的都只是A在B的左邊的情況,
以下語句B在A的右邊的又會出現什么情況呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid

其實對圖3左右翻轉一下就可以得出以下結論:
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所得出的記錄集也是一樣的。

第一次寫類似教程的貼子,希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助。謝謝大家支持。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费观看一区二区 | 久久成人免费大片 | 国产亚洲一欧美一区二区三区 | 体检小说| 美女视频在线观看视频 | 亚洲不卡视频在线 | 亚洲 欧美 国产 综合 播放 | 国产成人啪精品视频站午夜 | 欧美男同猛男 videos 同性 | 免费高清视频在线观看 | 国产成人综合一区人人 | 99re在线精品视频免费 | h肉动漫在线视频无修无遮挡 | 亚洲一区二区日韩欧美gif | 青青草人人 | 久热在线这里只有精品7 | 60岁妇女毛片免费观看 | 男人狂躁女人gif动态图 | 女人肮脏的交易中文字幕未删减版 | 四川一级毛片 | 奇米影视欧美 | 国产拍拍拍免费专区在线观看 | 精品四虎国产在免费观看 | 美女脱小内内给男生摸j | 欧美一区二区三区免费看 | 午夜国产在线 | 日韩专区 | 动态图啪啪120秒免费看 | 好爽好深好猛好舒服视频上 | 欧美最猛性xxxxx短视频 | 久草在线草a免费线看 | 三叶草私人研究所 | 超级乱淫变态伦短篇小说全集 | 成人综合婷婷国产精品久久免费 | 五月婷婷在线播放 | 成人国产网站v片免费观看 成人国产精品视频 | 色妞视频一级毛片 | jizzjizzjⅰzz亚洲美女 | 国产午夜精品福利久久 | 东北老女人91p0rny | 国产精品视频在线观看 |