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,即顯示左連接、右連接和內連接的並集
,如果你使用join連表,缺陷的情況下是inner join,另外,開發中使用的left join和right join屬於outer join,另外outer join還包括full join.下面我通過圖標讓大家認識它們的區別。
現有兩張表,Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的:
1.INNER JOIN 產生的結果是AB的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

2.LEFT [OUTER] JOIN 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
![LEFT [OUTER] JOIN 產生表A的完全集,而B表中匹配的則有值](/image/aHR0cDovL3d3dy5waHBkZHQuY29tL3Vzci91cGxvYWRzLzIwMTMvMDgvMTQzMzcyOTA2MC5wbmc=.png)
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的並集](/image/aHR0cDovL3d3dy5waHBkZHQuY29tL3Vzci91cGxvYWRzLzIwMTMvMDgvMjgzMjQxOTY0Ni5wbmc=.png)
5. CROSS JOIN 把表A和表B的數據進行一個N*M的組合,即笛卡爾積。如本例會產生4*4=16條記錄,在開發過程中我們肯定是要過濾數據,所以這種很少用。
SELECT * FROM TableA CROSS JOIN TableB
相信大家對inner join、outer join和cross join的區別一目了然了。
