這里有兩張表TableA和TableB,分別是姓名表和年齡表,用於我們例子的測試數據
TableA
id
|
name
|
1
|
t1
|
2
|
t2
|
4 |
t4
|
id
|
age
|
1
|
18
|
2
|
20 |
3
|
19
|
在開發中我們的業務需求有時候是復雜的,多張表聯合查詢的時候是有多種方式的,面對不同的需求,
靈活使用不同的表連接方式,那么表連接分成哪幾種呢?
表連接有幾種?
sql表連接分成
外連接、
內連接和
交叉連接。
一.外連接
概述:
外連接包括三種,分別是左外連接、右外連接、全外連接。
對應的sql關鍵字:LEFT/RIGHT/FULL OUTER JOIN,通常我們都省略OUTER關鍵字,寫成LEFT/RIGHT/FULL JOIN。
在左、右外連接中都會以一種表為基表,基表的所有行、列都會顯示,外表如果和條件不匹配則所有的外表列值都為NULL。
全外連接則所有表的行、列都會顯示,條件不匹配的值皆為NULL。
1.左外連接示例:
sql語句: select * from TableA left join TableB on TableA.id=TableB.id
結果:
id
|
name
|
id
|
age
|
1
|
t1
|
1
|
18
|
2
|
t2
|
2
|
20
|
4
|
t4
|
NULL |
NULL
|
注釋:TableA(基表)中所有的行列都顯示了,第三行的條件不匹配所有TableB(外表)的值都為NULL。
2.右外連接示例:
sql語句: select * from TableA right join TableB on TableA.id=TableB.id
結果:
id
|
name
|
id
|
age
|
1
|
t1
|
1
|
18
|
2
|
t2
|
2
|
20
|
NULL
|
NULL
|
3 |
19
|
3.全外連接示例:
sql語句:select * from TableA full join TableB on TableA.id=TableB.id
結果:
id
|
name
|
id
|
age
|
1
|
t1
|
1
|
18
|
2
|
t2
|
2
|
20
|
NULL | NULL | 3 |
19
|
4 | t4 |
NULL
|
NULL |
注釋:TableA和TableB的所有行列都顯示了,條件不匹配的行的值為NULL
二.內連接
概述:內連接是用比較運算符比較要連接的列的值的連接,不匹配的行不會被顯示。sql關鍵字JOIN 或者INNER JOIN,通常我們寫成JOIN
例子:
select * from TableA JOIN TableB on TableA.id=TableB.id
結果:
id
|
name
|
id
|
age
|
1
|
t1
|
1
|
18
|
2
|
t2
|
2
|
20
|
以上寫法等效於:
select * from TableA,TableB where TableA.id=TableB.id
select * from TableA cross join TableB where TableA.id=TableB.id (cross join 后只能用where不能用on)
三.交叉連接
概念:沒有where條件的交叉連接將產生連接表所涉及的笛卡爾積。即TableA的行數*TableB的行數的結果集。(TableA 3行*TableB 3行=9行)
概念:沒有where條件的交叉連接將產生連接表所涉及的笛卡爾積。即TableA的行數*TableB的行數的結果集。(TableA 3行*TableB 3行=9行)
sql語句:
select * from TableA cross join TableB
結果:
id
|
name
|
id
|
age
|
1
|
t1
|
1
|
18
|
2
|
t2
|
1
|
18
|
4
|
t4
|
1
|
18
|
1
|
t1
|
2
|
20
|
2
|
t2
|
2
|
20
|
4
|
t4
|
2
|
20
|
1
|
t1
|
3
|
19
|
2
|
t2
|
3
|
19
|
4
|
t4
|
3
|
19
|
以上寫法等效於:
select * from TableA,TableB
參考文章:
ps:
這完全是拋磚引玉,本人寫的不好,希望大神們能多多指點,共同探討,共同學習。