从语法层面上看,
全外连接full outer join
左连接是left outer join
右连接是right outer join
内连接是inner join
自连接是自身表与自身表进行的左右连接,需要注意的是并没有左内连接和右内连接。
左外连接
sql
select * from A left outer join B on A.id = B.id;
左外连接是把左边作为基表,在右表中找到和左表匹配的数据组合在一块,如果没找到的话就是空,总之左表的数据会全部展示出来。
结果是返回左右表交集和左表全数据。
右外连接
sql
select * from C right outer join D on C.id = D.id;
右外连接则刚好和左外连接相反,是把右表作为基表。在实际开发中实际上用到的右连接基本上可以改写成左连接的形式,比如下列的左右连接其实效果是一致的。
sql
select * from A left outer join B on A.id = B.id;
select * from B right outer join A on A.id = B.id;
结果是返回左右表交集和右表全数据。
全外连接
sql
select * from A full outer join B on A.id=B.id;
全外连接是会把左外连接和右外连接的结果整合到一起并去重。
另外,有的数据库关于外连接的outer关键字可以省略不写,但有的不能省略,如下
sql
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;
结果是返回左右表并集。
内连接
内连接的具体语法如下,
sql
select * from A inner join B on A.id=B.id;
顾名思义,内连接只会返回同时在A和B中满足条件,在这里也就是id在A和B中都存在并且id相同的数据,这里的inner有时候也可省略。
结果是返回左右表交集。
自连接
自连接并不是一种连接结构,而是一种逻辑上的称呼,自连接可以使用外连接也可以使用内连接。比如对表A和A自身进行内连接或者外连接筛选出想要的数据。一般大多数情况都是表A和A以外的表,但一些业务情况下可能会出现与本表连接的情况。常见的例子比如员工表,如下,张三是公司老大没有领导,李四和王五的manager_id 是1,代表张三是李四和王五的直属领导,而李四是赵六的领导,王五是甲七的领导。
log
+------+------+------------+
| id | name | manager_id |
+------+------+------------+
| 1 | 张三 | 0 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 赵六 | 2 |
| 5 | 甲七 | 3 |
+------+------+------------+
此时可能就会有需求,比如查询赵六的领导是谁?就会用到自连接,语法示例如下
sql
select B.name from emp A join emp B on A.manager_id=B.id where A.name='赵六';
查出来结果如下
log
+------+
| name |
+------+
| 李四 |
+------+
总结表格
连接类型 | 语法 | 结果 | 特点 |
---|---|---|---|
内连接 | SELECT * FROM A INNER JOIN B |
左右表交集 | 只返回匹配的行 |
左外连接 | SELECT * FROM A LEFT JOIN B |
左表全数据 + 左右表交集 | 左表为主,右表无匹配时用 NULL |
右外连接 | SELECT * FROM A RIGHT JOIN B |
右表全数据 + 左右表交集 | 右表为主,左表无匹配时用 NULL |
全外连接 | SELECT * FROM A FULL JOIN B |
左表全数据 + 右表全数据 - 重复行 | 左表和右表的并集 |
自连接 | SELECT * FROM A A1 JOIN A A2 |
表内关联数据 | 同一张表与自身连接 |