在之前我對MSSQL中的內連接和外連接所得出的數據集不是很清楚這幾天重新溫習了一下SQL的書本現在的思路應該是很清楚了現在把自己的理解發出來給大家溫習下希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助(發這麼菜的教程各位大大們別笑話偶了呵:D )
有兩個表A和表B
表A結構如下
Aidint標識種子主鍵自增ID
Anamevarchar
數據情況即用select * from A出來的記錄情況如下圖所示
|
圖:A表數據
表B結構如下
Bidint標識種子主鍵自增ID
Bnameidint
數據情況即用select * from B出來的記錄情況如下圖所示
圖:B表數據
為了把Bid和Aid加以區分不讓大家有誤解所以把Bid的起始種子設置為
有SQL基本知識的人都知道兩個表要做連接就必須有個連接字段從上表中的數據可以看出在A表中的Aid和B表中的Bnameid就是兩個連接字段
下圖說明了連接的所有記錄集之間的關系
圖:連接關系圖
現在我們對內連接和外連接一一講解
內連接利用內連接可獲取兩表的公共部分的記錄即圖的記錄集C
語句如下Select * from A JOIN B ON AAid=BBnameid
運行結果如下圖所示
圖:內連接數據
其實select * from AB where AAid=BBnameid與Select * from A JOIN B ON AAid=BBnameid的運行結果是一樣的
外連接外連接分為兩種一種是左連接(Left JOIN)和右連接(Right JOIN)
()左連接(Left JOIN)即圖公共部分記錄集C+表A記錄集A
語句如下select * from A Left JOIN B ON AAid=BBnameid
運行結果如下圖所示
圖:左連接數據
說明
在語句中A在B的左邊並且是Left Join所以其運算方式為A左連接B的記錄=圖公共部分記錄集C+表A記錄集A
在圖中即記錄集C中的存在的Aid為
圖中即表A所有記錄集A中存在的Aid為
表A記錄集A中存在的Aid=(圖中即A表中所有Aid)(圖中即記錄集C中存在的Aid)最終得出為
由此得出圖中A左連接B的記錄=圖公共部分記錄集C+表A記錄集A
最終得出的結果圖中可以看出Bnameid及Bid非NULL的記錄都為圖公共部分記錄集C中的記錄Bnameid及Bid為NULL的Aid為 的四筆記錄就是表A記錄集A中存在的Aid
()右連接(Right JOIN)即圖公共部分記錄集C+表B記錄集B
語句如下select * from A Right JOIN B ON AAid=BBnameid
運行結果如下圖所示
圖:右連接數據
說明
在語句中A在B的左邊並且是Right Join所以其運算方式為A右連接B的記錄=圖公共部分記錄集C+表B記錄集B
在圖中即記錄集C中的存在的Aid為
圖中即表B所有記錄集B中存在的Bnameid為
表B記錄集B中存在的Bnameid=(圖中即B表中所有Bnameid)(圖中即記錄集C中存在的Aid)最終得出為
由此得出圖中A右連接B的記錄=圖公共部分記錄集C+表B記錄集B
最終得出的結果圖中可以看出Aid及Aname非NULL的記錄都為圖公共部分記錄集C中的記錄Aid及Aname為NULL的Aid為的記錄就是表B記錄集B中存在的Bnameid
總結
通過上面的運算解說相信很多人已經想到上面的情況(包括圖的關系圖)說明的都只是A在B的左邊的情況
以下語句B在A的右邊的又會出現什麼情況呢??
select * from B Left JOIN A ON AAid=BBnameid
select * from B Right JOIN A ON AAid=BBnameid
其實對圖左右翻轉一下就可以得出以下結論
select * from B Left JOIN A ON AAid=BBnameid和select * from A Right JOIN B ON AAid=BBnameid所得出的記錄集是一樣的
而
select * from B Right JOIN A ON AAid=BBnameid和select * from A Left JOIN B ON AAid=BBnameid所得出的記錄集也是一樣的
From:http://tw.wingwit.com/Article/program/Oracle/201311/17198.html