兩個表需要有共同的字段用來做對應(yīng)關(guān)系,假定表a 的ab字段和表b 的bc字段意義是一樣的:
做網(wǎng)站、網(wǎng)站制作服務(wù)團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標準與要求,同時竭誠為客戶提供服務(wù)是我們的理念。成都創(chuàng)新互聯(lián)公司把每個網(wǎng)站當做一個產(chǎn)品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!
新建兩張表:
表a:ab ac ad
1 1 2
2 3 4
3 5 6
表b: bc bd be
1 7 8
3 9 10
4 11 12
(此時這樣建表只是為了演示連接SQL語句,當然實際開發(fā)中我們不會這樣建表,實際開發(fā)中這兩個表會有自己不同的主鍵。)
一、外連接
外連接可分為:左連接、右連接、完全外連接。
1、左連接 left join 或 left outer join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果以ab行為準:
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
其中b表bc第二行的值在ab中沒有對應(yīng)的所以左連無法找出來,同理右連會變成這樣:
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果以bd行為準:
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
0 0 0 4 11 12
左外連接包含left join左表所有行,如果左表中某行在右表沒有匹配,則結(jié)果中對應(yīng)行右表的部分全部為0.
注:此時我們不能說結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù)。當然此處查詢結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù),因為左右兩表此時為一對一關(guān)系。
右外連接包含right join右表所有行,如果左表中某行在右表沒有匹配,則結(jié)果中對應(yīng)左表的部分全部為0。
注:同樣此時我們不能說結(jié)果的行數(shù)等于右表的行數(shù)。當然此處查詢結(jié)果的行數(shù)等于左表數(shù)據(jù)的行數(shù),因為左右兩表此時為一對一關(guān)系。
3、完全外連接 full join 或 full outer join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a full join 表b on 表a.ab=表b.bd執(zhí)行結(jié)果:
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
0 0 0 4 11 12
完全外連接包含full join左右兩表中所有的行,如果右表中某行在左表中沒有匹配,則結(jié)果中對應(yīng)行右表的部分全部為0,如果左表中某行在右表中沒有匹配,則結(jié)果中對應(yīng)行左表的部分全部為0。
二、內(nèi)連接 join 或 inner join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a inner join 表b on 表a.ab=表b.bdinner join 是比較運算符,只返回符合條件的行。
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
三、交叉連接 cross join
1.概念:沒有 WHERE 子句的交叉聯(lián)接將產(chǎn)生連接所涉及的表的笛卡爾積。第一個表的行數(shù)乘以第二個表的行數(shù)等于笛卡爾積結(jié)果集的大小。
表a: ab
星期一
星期二
星期三
表b: cd
張三
李四
王五
SELECT a.ab,b.cd FROM 表a CROSS JOIN 表b
ab cd
星期一 張三
星期一 李四
星期一 王五
星期二 張三
星期二 李四
星期二 王五
星期三 張三
星期三 李四
星期三 王五
SQL中的 join 可以根據(jù)相應(yīng)條件把指定的表給結(jié)合起來并將數(shù)據(jù)返回。
內(nèi)連接是基于連接謂詞將倆張表(如A和B)的列組合到一起產(chǎn)生新的結(jié)果表,在表中存在至少一個匹配時,INNER JOIN 關(guān)鍵字返回行
左外連接Left join關(guān)鍵字會從左表那里返回所有的行,即使是在右表中沒有匹配到的行?
右外連接關(guān)鍵字Right join會從右表那里返回所有的行,即使是在左表中沒有匹配到的行?
全連接的關(guān)鍵字Full join,只要其中某個表中存在匹配,F(xiàn)ull join 就會返回行
交叉連接一般使用的比較少,交叉連接又稱笛卡爾連接或者叉乘連接,如果,A和B是倆個集合,他們的交叉連接就是A*B?
合并思想. N個表 -- 1個表
連接的定義
將2個或2個以上的表通過一定的條件拼接起來形成一個虛表的過程。連接是from子句的一部分.
從2個表的連接開始.
左表: 放置在你左手邊的表. left_tab
右表: 放置在你右手邊的表. right_tab
連接語法
三種基本類型: 交叉連接,內(nèi)連接與外連接
交叉連接
返回的就是一個笛卡爾積.
交叉連接語法
內(nèi)連接
在交叉連接的基礎(chǔ)上,僅返回滿足連接條件的行.
連接條件
1.使用on關(guān)鍵字來指定.
2.on的用法與where類似.
3.on可以使用連接的所有表中的列值進行判斷
內(nèi)連接的語法
外連接
在內(nèi)連接的基礎(chǔ)上,返回一些額外的行.
左外連接(左連接)
在內(nèi)連接的基礎(chǔ)上,左表除了返回滿足連接條件的行之外,剩下的所有不滿足連接條件的行也要一并返回,右表中與之沒有匹配的行的列值設(shè)置為null
右外連接(右連接)
在內(nèi)連接的基礎(chǔ)上,右表除了返回滿足連接條件的行之外,剩下的所有不滿足連接條件的行也要一并返回,左表中與之沒有匹配的行的列值設(shè)置為null
外連接語法
語法:
表的別名
注意: 一旦給表設(shè)置了別名,則以后只能通過別名引用表中的列.別名會隱藏表名.
join嵌套
可以在一個join中嵌套另外一個join
一般來說,當連接的表的個數(shù)N=3時需要使用嵌套join.
當連接的表的個數(shù)為N時,則至少需要N-1個連接條件.
語法:
join嵌套
與內(nèi)連接中的join嵌套用法類似.
學生student表:
課程course表:
交叉連接:
結(jié)果為兩張表的笛卡爾積:
內(nèi)連接(inner join ,inner 可以省略)
顯示內(nèi)連接和隱示內(nèi)連接獲得的查詢結(jié)果是一樣的,都是A表和B表的交集(例:A.id = B.id),但是只能查到有關(guān)系的信息,如果A表的一條數(shù)據(jù)的與B表關(guān)聯(lián)的字段沒有對應(yīng)的信息(如:A.id = null),即:這條數(shù)據(jù)在B表中沒有對應(yīng)的信息,則無法獲得。
外連接(outer join,outer可以省略)
左外連接獲得的查詢結(jié)果是左邊的表A的全部信息和A,B兩張表的交集,左邊A表的全部包含A表中在B表中沒有對應(yīng)關(guān)系的信息。
右外連接獲得的查詢結(jié)果是右邊的表B的全部信息和A,B兩張表的交集,右邊B表的全部包含B表中在A表中沒有對應(yīng)關(guān)系的信息。