聽同學說有校招筆試考到這個概念,一般沒有專門學習數(shù)據(jù)庫的話對這個都不是很了解,但是其實很簡單,看到一篇博客對這個概念解釋的很清楚,故而轉載。
有兩個表A和表B。 表A結構如下: Aid:int;標識種子,主鍵,自增ID Aname:varchar 數(shù)據(jù)情況,即用select * from A出來的記錄情況如下圖1所示: |
表B結構如下: Bid:int;標識種子,主鍵,自增ID Bnameid:int 數(shù)據(jù)情況,即用select * from B出來的記錄情況如下圖2所示:圖2:B表數(shù)據(jù) 為了把Bid和Aid加以區(qū)分,不讓大家有誤解,所以把Bid的起始種子設置為100。 有SQL基本知識的人都知道,兩個表要做連接,就必須有個連接字段,從上表中的數(shù)據(jù)可以看出,在A表中的Aid和B表中的Bnameid就是兩個連接字段。 下圖3說明了連接的所有記錄集之間的關系:
圖3:連接關系圖現(xiàn)在我們對內連接和外連接一一講解。 1.內連接:利用內連接可獲取兩表的公共部分的記錄,即圖3的記錄集C 語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid 運行結果如下圖4所示:
圖4:內連接數(shù)據(jù) 其實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所示:
圖5:左連接數(shù)據(jù) 說明: 在語句中,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:右連接數(shù)據(jù) 說明: 在語句中,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的右邊的又會出現(xiàn)什么情況呢?? 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所得出的記錄集也是一樣的。
Another Demo from http://mouer.javaeye.com/blog/901153
在Oracle的SQL語句常用的連接有內連接(inner join),外連接(outer join)等,內連接又包括等值連接,非等值連接,自連接;而外連接又分為左連接和右連接。其中默認的是內連接的等值連接。
內連接:利用內連接(等值)就可獲取公共部分C,圖中的數(shù)據(jù)集C.
select * from A inner join B on A.Aid=B.Bid;等價于select * from A,B where A.Aid=B.Bid 圖中C的部分
外連接:分為左外連接(left join)與右外連接(right join)左外連接:select * from A,B where A.Aid=B.Bid(+);等價于select * from A left outer joinB on A.id=B.id圖中A+C的部分
右外連接:select * from A,B where A.Aid(+)=B.Bid;等價于select * from Aright outer joinB on A.id=B.id圖中B+C的部分
新聞熱點
疑難解答