數(shù)據(jù)庫的左連接,右連接,自連接,內(nèi)連接,外連接的區(qū)別
從語法層面上看,
全外連接full outer join
左連接是left outer join
右連接是right outer join
內(nèi)連接是inner join
自連接是自身表與自身表進行的左右連接,需要注意的是并沒有左內(nèi)連接和右內(nèi)連接。
左外連接
select * from A left outer join B on A.id = B.id;
左外連接是把左邊作為基表,在右表中找到和左表匹配的數(shù)據(jù)組合在一塊,如果沒找到的話就是空,總之左表的數(shù)據(jù)會全部展示出來。
結(jié)果是返回左右表交集和左表全數(shù)據(jù)。
右外連接
select * from C right outer join D on C.id = D.id;
右外連接則剛好和左外連接相反,是把右表作為基表。在實際開發(fā)中實際上用到的右連接基本上可以改寫成左連接的形式,比如下列的左右連接其實效果是一致的。
select * from A left outer join B on A.id = B.id;
select * from B right outer join A on A.id = B.id;
結(jié)果是返回左右表交集和右表全數(shù)據(jù)。
全外連接
select * from A full outer join B on A.id=B.id;
全外連接是會把左外連接和右外連接的結(jié)果整合到一起并去重。
另外,有的數(shù)據(jù)庫關(guān)于外連接的outer關(guān)鍵字可以省略不寫,但有的不能省略,如下
select * from A left join B on A.id = B.id;
select * from A right join B on A.id = B.id;
select * from A full join B on A.id = B.id;
結(jié)果是返回左右表并集。
內(nèi)連接
內(nèi)連接的具體語法如下,
select * from A inner join B on A.id=B.id;
顧名思義,內(nèi)連接只會返回同時在A和B中滿足條件,在這里也就是id在A和B中都存在并且id相同的數(shù)據(jù),這里的inner有時候也可省略。
結(jié)果是返回左右表交集。
自連接
自連接并不是一種連接結(jié)構(gòu),而是一種邏輯上的稱呼,自連接可以使用外連接也可以使用內(nèi)連接。比如對表A和A自身進行內(nèi)連接或者外連接篩選出想要的數(shù)據(jù)。一般大多數(shù)情況都是表A和A以外的表,但一些業(yè)務(wù)情況下可能會出現(xiàn)與本表連接的情況。常見的例子比如員工表,如下,張三是公司老大沒有領(lǐng)導(dǎo),李四和王五的manager_id 是1,代表張三是李四和王五的直屬領(lǐng)導(dǎo),而李四是趙六的領(lǐng)導(dǎo),王五是甲七的領(lǐng)導(dǎo)。
+------+------+------------+
| id | name | manager_id |
+------+------+------------+
| 1 | 張三 | 0 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 趙六 | 2 |
| 5 | 甲七 | 3 |
+------+------+------------+
此時可能就會有需求,比如查詢趙六的領(lǐng)導(dǎo)是誰?就會用到自連接,語法示例如下
select B.name from emp A join emp B on A.manager_id=B.id where A.name='趙六';
查出來結(jié)果如下
+------+
| name |
+------+
| 李四 |
+------+
總結(jié)表格
內(nèi)連接 | SELECT * FROM A INNER JOIN B |
左右表交集 | 只返回匹配的行 |
左外連接 | SELECT * FROM A LEFT JOIN B |
左表全數(shù)據(jù) + 左右表交集 | 左表為主,右表無匹配時用 NULL |
右外連接 | SELECT * FROM A RIGHT JOIN B |
右表全數(shù)據(jù) + 左右表交集 | 右表為主,左表無匹配時用 NULL |
全外連接 | SELECT * FROM A FULL JOIN B |
左表全數(shù)據(jù) + 右表全數(shù)據(jù) - 重復(fù)行 | 左表和右表的并集 |
自連接 | SELECT * FROM A A1 JOIN A A2 |
表內(nèi)關(guān)聯(lián)數(shù)據(jù) | 同一張表與自身連接 |