多表連接(inner join/left join/right join)

inner join 的解釋

2009-05-29 20:31

 

有兩個表A和表B。

表A結構如下:

Aid:int;標識種子,主鍵,自增ID

Aname:varchar

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

多表連接(inner join/left join/right join) - 冰冰心心 - 遇見

圖1:A表數據

表B結構如下:

Bid:int;標識種子,主鍵,自增ID

Bnameid:int

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

多表連接(inner join/left join/right join) - 冰冰心心 - 遇見

圖2:B表數據

爲了把Bid和Aid加以區分,不讓大家有誤解,所以把Bid的起始種子設置爲100。

有SQL基本知識的人都知道,兩個表要做連接,就必須有個連接字段,從上表中的數據可以看出,在A表中的Aid和B表中的Bnameid就是兩個連接字段。

下圖3說明了連接的所有記錄集之間的關係:

多表連接(inner join/left join/right join) - 冰冰心心 - 遇見

圖3:連接關係圖

現在我們對內連接和外連接一一講解。

1.內連接:利用內連接可獲取兩表的公共部分的記錄,即圖3的記錄集C

語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid

運行結果如下圖4所示:

多表連接(inner join/left join/right 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所示:

多表連接(inner join/left join/right 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所示:

多表連接(inner join/left join/right 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所得出的記錄集也是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章