首頁 >資料庫 >mysql教程 >內連接、左外連接、右外連接、交叉連接它們的區別是什麼

內連接、左外連接、右外連接、交叉連接它們的區別是什麼

怪我咯
怪我咯原創
2017-06-23 13:39:565436瀏覽

內連接、左外連接、右外連接、交叉連接區別

在之前,我對MSSQL中的內連接和外連接所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連結語句不太懂的朋友能夠有所幫助。 (發這麼菜的教程,各位大大們別笑話偶了,呵:D ) 有兩個表A和表B。表A結構如下: Aid:int;標識種子,主鍵,自增ID Aname:varchar 資料情況,即用select * from A出來的記錄情況如下圖1所示:
 


#圖1:A表資料
表B結構如下: Bid:int;標識種子,主鍵,自增ID Bnameid:int 資料情況,即用select * from B出來的記錄情況如下圖2所示:
 
 


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

#圖3:連結關係圖 
現在我們對內連接和外連接一一講解。  1.內連結:利用內連線可取得兩表的公共部分的記錄,即圖3的記錄集C 語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid 運行結果如下圖4所示:其實select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運作結果是一樣的。
 
 
 
圖4:內連接資料

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


圖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所示:


圖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。    
交叉連結:兩個表格合併沒有條件情況下,條數 = 圖1 * 圖2

以上是內連接、左外連接、右外連接、交叉連接它們的區別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn