缺省情況下是inner join,開(kāi)發(fā)中使用的left join和right join屬于outer join,另外outer join還包括full join.下面我通過(guò)圖標(biāo)讓大家認(rèn)識(shí)它們的區(qū)別∥啦。現(xiàn)有兩張表,Table A 是左邊的表亿胸。Table B 是右邊的表坯钦。其各有四條記錄,其中有兩條記錄name是相同的:
Table A 是左邊的表侈玄。Table B 是右邊的表婉刀。
1.INNER JOIN 產(chǎn)生的結(jié)果是AB的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
INNER JOIN 產(chǎn)生的結(jié)果是AB的交集
INNER JOIN 產(chǎn)生的結(jié)果是AB的交集
LEFT [OUTER] JOIN 產(chǎn)生表A的完全集,而B(niǎo)表中匹配的則有值
LEFT [OUTER] JOIN 產(chǎn)生表A的完全集潘悼,而B(niǎo)表中匹配的則有值
**4.FULL [OUTER] JOIN 產(chǎn)生A和B的并集。對(duì)于沒(méi)有匹配的記錄宾添,則會(huì)以null做為值船惨。SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 你可以通過(guò)is NULL將沒(méi)有匹配的值找出來(lái):SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.nameWHERE TableA.id IS null OR TableB.id IS null
FULL [OUTER] JOIN 產(chǎn)生A和B的并集
FULL [OUTER] JOIN 產(chǎn)生A和B的并集
5. CROSS JOIN 把表A和表B的數(shù)據(jù)進(jìn)行一個(gè)NM的組合,即笛卡爾積缕陕。如本例會(huì)產(chǎn)生44=16條記錄粱锐,在開(kāi)發(fā)過(guò)程中我們肯定是要過(guò)濾數(shù)據(jù),所以這種很少用扛邑。SELECT * FROM TableA CROSS JOIN TableB 相信大家對(duì)inner join卜范、outer join和cross join的區(qū)別一目了然了。
補(bǔ)充
為什么最好用join鹿榜?因?yàn)橛谩昂Q弊霰磉B接的話,A,B表直接產(chǎn)生笛卡爾積舱殿,然后在用where篩選結(jié)果奥裸。但是join連接,A,B表連接的時(shí)候就會(huì)根據(jù)on后面的條件篩選沪袭,然后在根據(jù)where條件篩選結(jié)果