SQL中join和cross join的區別

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

1. 交叉鏈接CROSS JOIN開發

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

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

A:SELECT * FROM table1 CROSS JOIN table2select

B:SELECT * FROM table1,table2方法

 

C:select * from table1 a inner join table2 bim

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)img

C:select * from table1 a inner join table2 b on a.id=b.idtab

通常不建議使用方法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,即顯示左鏈接、右鏈接和內鏈接的並集

 

,若是你使用join連表,缺陷的狀況下是inner join,另外,開發中使用的left join和right join屬於outer join,另外outer join還包括full join.下面我經過圖標讓你們認識它們的區別。
現有兩張表,Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的:
Table A 是左邊的表。Table B 是右邊的表。

1.INNER JOIN 產生的結果是AB的交集

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
INNER JOIN 產生的結果是AB的交集          INNER JOIN 產生的結果是AB的交集
2.LEFT [OUTER] JOIN 產生表A的徹底集,而B表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
LEFT [OUTER] JOIN 產生表A的徹底集,而B表中匹配的則有值           LEFT [OUTER] JOIN 產生表A的徹底集,而B表中匹配的則有值
3.RIGHT [OUTER] JOIN 產生表B的徹底集,而A表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.name = TableB.name
圖標如left join相似。

4.FULL [OUTER] JOIN 產生A和B的並集。對於沒有匹配的記錄,則會以null作爲值。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 
你能夠經過is NULL將沒有匹配的值找出來:
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null 
 FULL [OUTER] JOIN 產生A和B的並集           FULL [OUTER] JOIN 產生A和B的並集

5. CROSS JOIN 把表A和表B的數據進行一個N*M的組合,即笛卡爾積。如本例會產生4*4=16條記錄,在開發過程當中咱們確定是要過濾數據,因此這種不多用。SELECT * FROM TableA CROSS JOIN TableB 相信你們對inner join、outer join和cross join的區別一目瞭然了。

相關文章
相關標籤/搜索