在之前,我對mysql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下
sql的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對
sql的連線語句不太理解的朋友能夠有所幫助。(發這麼菜的教程,各位大大們別笑話偶了,呵
:d )
有兩個表a和表b
。表a結構如下:
aid:
int;標識種子,主鍵,自增
idaname:
varchar
資料情況,即用select * from a
出來的記錄情況如下圖
1所示:
圖1:a
表資料表b
結構如下:
bid:
int;標識種子,主鍵,自增
idbnameid:
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
所得出的記錄集也是一樣的。
你是要弄清楚區別在什麼地方還是單純想要文字說明
文字說明的樓上說了一大堆了,不說了。
弄個例題,直觀一點。兩個表:
--表stu
id name
1, jack
2, tom
3, kity
4, nono
--表exam
id grade
1, 56
2, 76
11, 89
內連線(顯示兩表id匹配的)
select stu.id,exam.id,stu.name, exam.grade from stu inner join exam on stu.id=exam.id
stu.id exam.id name grade
1 1 jack 56
2 2 tom 76
左連線(顯示join 左邊的表的所有資料,
exam
只有兩條記錄,所以
stu.id,grade
都用null
顯示)
select stu.id,exam.id,stu.name, exam.grade from stu left join exam on stu.id=exam.id
1 1 jack 56
2 2 tom 76
3 null kity null
4 null nono null
右連線(與作連線相反,顯示join右邊表的所有資料)
select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id
1 1 jack 56
2 2 tom 76
null 11 null 89
內連線和外連線
在oracle的sql語句常用的連線有內連線 inner join 外連線 outer join 等,內連線又包括等值連線,非等值連線,自連線 而外連線又分為左連線和右連線。其中預設的是內連線的等值連線。內連線 利用內連線 等值 就可獲取公共部分c,圖中的資料集c.select from a inn...
內連線外連線
內連線 內連線也叫連線,是最早的一種連線,最早被稱為普通連線或自然連線。內連線是從結果中刪除其他被連線表中沒有匹配行的所有行,所以內連線可能會丟失資訊。內連線的語法 select fieldlist from table1 inner join table2 on table1.column tab...
理解內連線和外連線
內連線 進行連線的兩個表對應的相匹配的字段完全相同的連線。join 外連線又分為左外連線和右外連線。左連線即left outer join 兩個表進行左連線時會返回左邊表中的所有的行和右邊表中與之相匹配的列值沒有相匹配的用空值代替。右連線即right outer join 兩個表進行右連線時會返回右...