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