SQL的各种连接(cross join、inner join、full join)的用法理解
SQL中的連接可以分為內(nèi)連接,外連接,以及交叉連接 。
1. 交叉連接CROSS JOIN
如果不帶WHERE條件子句,它將會返回被連接的兩個表的笛卡爾積,返回結(jié)果的行數(shù)等于兩個表行數(shù)的乘積;
舉例,下列A、B、C 執(zhí)行結(jié)果相同,但是效率不一樣:
A:SELECT * FROM table1 CROSS JOIN table2
B:SELECT * FROM table1,table2
?
C:select * from table1 a inner join table2 b
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加條件只能用where,不能用on)
C:select * from table1 a inner join table2 b on a.id=b.id
一般不建議使用方法A和B,因?yàn)槿绻蠾HERE子句的話,往往會先生成兩個表行數(shù)乘積的行的數(shù)據(jù)表然后才根據(jù)WHERE條件從中選擇。?
因此,如果兩個需要求交際的表太大,將會非常非常慢,不建議使用。
2.?內(nèi)連接INNER JOIN
兩邊表同時符合條件的組合
如果僅僅使用
SELECT * FROM table1 INNER JOIN table2
內(nèi)連接如果沒有指定連接條件的話,和笛卡爾積的交叉連接結(jié)果一樣,但是不同于笛卡爾積的地方是,沒有笛卡爾積那么復(fù)雜要先生成行數(shù)乘積的數(shù)據(jù)表,內(nèi)連接的效率要高于笛卡爾積的交叉連接。
但是通常情況下,使用INNER JOIN需要指定連接條件。
?
***************關(guān)于等值連接和自然連接
等值連接(=號應(yīng)用于連接條件, 不會去除重復(fù)的列)
自然連接(會去除重復(fù)的列)
數(shù)據(jù)庫的連接運(yùn)算都是自然連接,因?yàn)椴辉试S有重復(fù)的行(元組)存在。
例如:
SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column
3.?外連接OUTER JOIN
指定條件的內(nèi)連接,僅僅返回符合連接條件的條目。
外連接則不同,返回的結(jié)果不僅包含符合連接條件的行,而且包括左表(左外連接時), 右表(右連接時)或者兩邊連接(全外連接時)的所有數(shù)據(jù)行。
1)左外連接LEFT [OUTER] JOIN
顯示符合條件的數(shù)據(jù)行,同時顯示左邊數(shù)據(jù)表不符合條件的數(shù)據(jù)行,右邊沒有對應(yīng)的條目顯示NULL
例如
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
2)右外連接RIGHT [OUTER] JOIN
顯示符合條件的數(shù)據(jù)行,同時顯示右邊數(shù)據(jù)表不符合條件的數(shù)據(jù)行,左邊沒有對應(yīng)的條目顯示NULL
例如
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
3)全外連接full [outer] join
顯示符合條件的數(shù)據(jù)行,同時顯示左右不符合條件的數(shù)據(jù)行,相應(yīng)的左右兩邊顯示NULL,即顯示左連接、右連接和內(nèi)連接的并集
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的SQL的各种连接(cross join、inner join、full join)的用法理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现数据导出
- 下一篇: [DLX反复覆盖] hdu 2828 L