內連線,左外連線(左連線),右外連線(右連線),全連線(交叉連線)
圖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:連線關係圖
現在我們對內連線和外連線一一講解。
圖4:內連線資料
2.外連線:外連線分為兩種,一種是左連線(Left JOIN)和右連線(Right JOIN)
(1)左連線(Left JOIN)
語句如下: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)
語句如下: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。
3.交叉連線(全連線):兩張表聯合沒有條件情況下,條數 = 圖1 * 圖2
select a.*,b.* from a full join b on a.id=b.parent_id
來源: http://www.cnblogs.com/Ewin/archive/2009/10/05/1578322.html