SQL的各類鏈接(cross join、inner join、full join)的用法理解

SQL中的鏈接能夠分爲內鏈接,外鏈接,以及交叉鏈接 。數據庫

1. 交叉鏈接CROSS JOIN

若是不帶WHERE條件子句,它將會返回被鏈接的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積;

舉例,下列A、B、C 執行結果相同,可是效率不同:

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,由於若是有WHERE子句的話,每每會先生成兩個錶行數乘積的行的數據表而後才根據WHERE條件從中選擇。 

所以,若是兩個須要求交際的表太大,將會很是很是慢,不建議使用。

2. 內鏈接INNER JOIN

兩邊表同時符合條件的組合

若是僅僅使用

SELECT * FROM table1 INNER JOIN table2

內鏈接若是沒有指定鏈接條件的話,和笛卡爾積的交叉鏈接結果同樣,可是不一樣於笛卡爾積的地方是,沒有笛卡爾積那麼複雜要先生成行數乘積的數據表,內鏈接的效率要高於笛卡爾積的交叉鏈接。

可是一般狀況下,使用INNER JOIN須要指定鏈接條件。

 

***************關於等值鏈接和天然鏈接

等值鏈接(=號應用於鏈接條件, 不會去除重複的列)

天然鏈接(會去除重複的列)

數據庫的鏈接運算都是天然鏈接,由於不容許有重複的行(元組)存在。

例如:

SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

3. 外鏈接OUTER JOIN

指定條件的內鏈接,僅僅返回符合鏈接條件的條目。

外鏈接則不一樣,返回的結果不只包含符合鏈接條件的行,並且包括左表(左外鏈接時), 右表(右鏈接時)或者兩邊鏈接(全外鏈接時)的全部數據行。

1)左外鏈接LEFT [OUTER] JOIN

顯示符合條件的數據行,同時顯示左邊數據表不符合條件的數據行,右邊沒有對應的條目顯示NULL

例如

SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column

2)右外鏈接RIGHT [OUTER] JOIN

顯示符合條件的數據行,同時顯示右邊數據表不符合條件的數據行,左邊沒有對應的條目顯示NULL

例如

SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column

3)全外鏈接full [outer] join

顯示符合條件的數據行,同時顯示左右不符合條件的數據行,相應的左右兩邊顯示NULL,即顯示左鏈接、右鏈接和內鏈接的並集
相關文章
相關標籤/搜索