sql表連接的方式有:外連接,內連接,交叉連接
外連接:
外連接包括三種,分別是左外連接、右外連接、全外連接。
對應的sql關鍵字:LEFT/RIGHT/FULL OUTER JOIN,通常我們都省略OUTER關鍵字,寫成LEFT/RIGHT/FULL JOIN。
在左、右外連接中都會以一種表為基表,基表的所有行、列都會顯示,外表如果和條件不匹配則所有的外表列值都為NULL。
全外連接則所有表的行、列都會顯示,條件不匹配的值皆為NULL。
內連接:內連接是用比較運算符比較要連接的列的值的連接,不匹配的行不會被顯示。sql關鍵字JOIN 或者INNER JOIN,通常我們寫成JOIN
交叉連接::沒有where條件的交叉連接將產生連接表所涉及的笛卡爾積。即TableA的行數*TableB的行數的結果集。(TableA 3行*TableB 3行=9行)
這里有兩張表,
TableA和TableB,分別是姓名表和年齡表,用於我們例子的測試數據
TableA
id
|
name
|
1
|
t1
|
2
|
t2
|
4 |
t4
|
TableB
id
|
age
|
1
|
18
|
2
|
20 |
3
|
19
|
一.外連接
外連接包括三種,分別是左外連接、右外連接、全外連接。(嗚嗚嗚......我哭暈在廁所了)
對應的sql關鍵字:LEFT、RIGHT、FULL OUTER JOIN,通常我們都省略OUTER關鍵字,
寫成LEFT、RIGHT、FULL JOIN。
接下來看看吧:
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
|
在左、右外連接中都會以一種表為基表,基表的所有行、列都會顯示,外表如果和條件不匹配則所有的外表列值都為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
|
注釋:TableB(基表)中所有的行列都顯示了,第三行的條件不匹配所有TableA(外表)的值都為NULL。
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行)
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
|
注釋:返回3*3=9行數據,即笛卡爾積。
以上寫法等效於:
select * from TableA,TableB
這里補一下笛卡爾積:
笛卡爾積的符號化為:
A×B={(x,y)|x∈A∧y∈B}
例如,A={a,b}, B={0,1,2},則
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
(不客氣)
???說到這里,你是不是一臉懵逼到底表連接是個什么鬼東西?
剛開始學的我也不知道,然后再深入去看了一下,有很大作用。
簡單來講,剛看到我們把兩個表,用連接的方式變成了一個表,這樣是不是就直接告訴我們如果需要查詢數據庫,就只需要查詢一個表就好了?!
在平時,我們將數據存在不同的表中,而不同的表有着它們自身的表結構,不同表之間可以是有關聯的,大部分實際使用中,不會僅僅只需要一張表的信息,比如需要從一個班級表中找出廣州地區的學生,再用這個信息去檢索成績表中他們的期末語文成績,如果沒有多表連接,那只能手動將第一個表的信息查詢出來作為第二個表的檢索信息去查詢最終的結果,你也能想到這個數據量有多大了吧~~
本文參考:https://www.cnblogs.com/GH0522/p/8579423.html