直接舉例說明各種方法:
CREATE table A ( id int, name varchar(200) ) CREATE table b ( id int, name varchar(200) ) INSERT INTO b VALUES(1,'張三') INSERT INTO b VALUES(2,'李四') INSERT INTO b VALUES(3,'王五') INSERT INTO b VALUES(4,'馬六') INSERT INTO b VALUES(5,'馮七') INSERT INTO a VALUES(1,'趙八') INSERT INTO a VALUES(2,'張三') INSERT INTO a VALUES(3,'馮七') INSERT INTO a VALUES(4,'田九') INSERT INTO a VALUES(5,'凌十')
第一種:Inner join
解釋:產生的結果是A和B的交集(相同列里面的相同值)。內連接是最常見的一種連接,它也被稱為普通連接,只連接匹配的行(僅對滿足連接條件的CROSS中的列)。它又分為等值連接(連接條件運算符為"=")和不等值連接(連接條件運算符不為"=",例如between...and)。
SELECT *FROM b INNER JOIN A
on b.name=A.name
第二種:Full Outer Join
解釋:產生的結果是A和B的並集(如果沒有相同的值會用null作為值)。FULL JOIN 會從左表和右表那里返回所有的行。如果其中一個表的數據行在另一個表中沒有匹配的行,那么對面的數據用NULL代替
SELECT * FROM b FULL OUTER JOIN A
on b.name=A.name
第三種:Left outer join
解釋:產生表B的完全集,而A表中匹配的則有值(沒有匹配的則以null值取代)。LEFT JOIN返回左表的全部行和右表滿足ON條件的行,如果左表的行在右表中沒有匹配,那么這一行右表中對應數據用NULL代替。
SELECT * FROM b Left outer join A
on b.name=A.name
第四種:Right Outer Join
解釋:參考第三種Left outer join
SELECT * FROM b Right Outer Join A
on b.name=A.name
第5種:cross join
解釋:cross對兩個表執行笛卡爾乘積。它為左表行和右表行的每種可能的組合返回一行。返回(左表行數*右表行數)行的表。ps:很少用到這個語法。注意如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於性能來說是非常危險的,尤其是表很大的時候。
SELECT * FROM b cross join A
特殊:Natural Join(oracle的用法,sqlserver里面不支持這種寫法。ps:大神可以糾正用法這里)
解釋:自然連接是一種特殊的等值連接,在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重復列。