內連線和外連線

2021-08-07 15:27:23 字數 4390 閱讀 9306

在之前,我對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 兩個表進行右連線時會返回右...