少壯不努力,老大徒傷悲sql
工做大半輩子了,來到個陌生的過分,從零開始,像個應屆畢業生同樣投入茫茫人才市場,碰的滿頭包。數據庫
凡是涉及到sql server的都會問,join的問題,不煩記錄下:ui
SQL的join有五種方式:3d
1.INNER JOIN or JOINserver
2.OUTER JOINblog
2.1 LEFT OUTER JOIN or LEFT JOINget
2.2 RIGHT OUTER JOIN or RIGHT JOINit
2.3 FULL OUTER JOIN or FULL JOINtable
3.NATURAL JOINclass
4.CROSS JOIN
5.SELF JOIN
兩種鏈接條件:
1.Equi JOIN
1.1 NATURAL
1.2 USING(a,b)
1.3= ...
2.Theta JOIN
2.1>=
2.2<=
2.3> ...
PS:USING(...)指定須要哪些列相等。ON則能夠指定任意的鏈接條件(=,>=,<=,!=,>,<...)123456789101112
3. JOIN or INNER JOIN
返回兩個表中同時知足條件的元組對,不知足的將被丟棄。
4. OUTER JOIN
4.1. LEFT OUTER JOIN
返回左表全部行以及右表知足條件的行,左表有值右表無值填充爲null
4.2 RIGHT OUTER JOIN
返回右表全部行以及左表知足條件的行,右表有值左表無值填充爲null
4.3 FULL OUTER JOIN
返回全部表的全部行,在知足條件的行以外,左表知足右表不知足或者相反,均填充null
5. NATURAL JOIN
一、來自兩個關係的元組對在共同屬性上的值相同。(不限於一個共同屬性,也能夠是多個共同屬性) 二、去掉重複的屬性(列)。 三、列出屬性的順序:先是共同屬性,而後是第一個關係的屬性,最後是第二個關係的屬性。
爲了防止兩個表有多個共同屬性時natural join 會忽略部分須要的元組對,應使用join…using(…),以指定須要哪些列相等 join…using(…)鏈接只能侷限在指定的屬性上
6. CROSS JOIN
返回笛卡兒積
7. SELF JOIN
至關於A JOIN A
附錄:
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,即顯示左鏈接、右鏈接和內鏈接的並集