有兩個表a和表b。
表a結構如下:
aid:int;標識種子,主鍵,自增id
aname:varchar
資料情況,即用select * from a出來的記錄情況如下圖1所示:
表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所示:
圖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所示:
圖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。
總結:通過上面的運算解說,相信很多人已經想到,上面的情況(包括圖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所得出的記錄集也是一樣的。
another demo from
在oracle的sql語句常用的連線有內連線(inner join),外連線(outer join)等,內連線又包括等值連線,非等值連線,自連線;而外連線又分為左連線和右連線。其中預設的是內連線的等值連線。
內連線:利用內連線(等值)就可獲取公共部分c,圖中的資料集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的部分
SQL的內連線與外連線
在oracle的sql語句常用的連線有內連線 inner join 外連線 outer join 等,內連線又包括等值連線,非等值連線,自連線 而外連線又分為左連線和右連線。其中預設的是內連線的等值連線。為了方便我們建立兩張最簡易的表a b,具體的表結構參看下面,來分析內連線與外連線的區別 圖1 圖...
SQL 內連線,外連線
假設一堆男女在教堂,有夫婦有單身的,假設男為左表,女為右表 教父說 結了婚的人請出去,結了婚的人請手拉手,於是結了婚的男女站了起來,這就是inner 內連 教父說 男的並且和這些男的結婚的女的請出去,結了婚的人請手拉手,於是,結了婚的夫婦手拉手出去,單身的男的也出去了。這就是 left 左連 教父說...
SQL 內連線 外連線
通過where 或者 inner join保留表中的一部分,最直觀就是說 表在選擇投影後,得到的各個元組內的元素都不會是空的。inner join 表中至少乙個匹配時,返回行。左連線 即使右表中沒有匹配,也從左表中返回所有行。因次,元組中的元素若有來自右表,則該元素為空。右連線 即使左表中沒有匹配,...