自连接意思就是表与其自身进行连接。虽然自连接并不是必须的,可以通过其他方式来完成,但是在某些情况下,使用自连接就比较方便。比如一张员工信息表,这张表上有该员工的基本信息,还有指明了他的上司的ID号。但是同时他的上司也是员工,在这张表上也有他的信息。如果我们需要显示出所有员工的姓名和他上司的姓名,虽然我们可以通过其他方式,比如使用子查询来完成这一任务,但是无疑使用自连接可能是最好的办法。比如下面这张表:
员工号码 | 员工姓名 | 上司号码 |
001 | 张三 | 003 |
002 | 李四 | 005 |
003 | 王五 | 009 |
004 | 赵六 | 003 |
005 | 吴七 | 010 |
006 | 周八 | 005 |
007 | 胡九 | 003 |
008 | 陈十 | 010 |
009 | 杨二 | 010 |
010 | 刘一 |
现在我们要查询出每个员工的姓名以及他上司的姓名,如果不使用自连接那么我们就可以用下面的方式来完成该查询
select name 员工姓名
,(select name from employee mg where ep.managerid = mg.id) 上司姓名
from employee ep
查询结果:
员工姓名 | 上司姓名 |
张三 | 王五 |
李四 | 吴七 |
王五 | 杨二 |
赵六 | 王五 |
吴七 | 刘一 |
周八 | 吴七 |
胡九 | 王五 |
陈十 | 刘一 |
杨二 | 刘一 |
刘一 |
在这个查询语句中,使用了一个子查询来完成对上司姓名的查询。
如果使用自连接。那么结构会感觉清晰许多,如:
select ep.name 员工姓名,mg.name 上司姓名
from EMPLOYEE ep
LEFT JOIN EMPLOYEE mg ON ep.managerid = mg.id
这里除了使用自连接外还使用了左外连接,因为‘刘一’这个员工是所有人的上司,并且他没有其他的上司,也就是说他是老总了。如果用内连接就会把这行记录过滤掉,因为没有和他匹配的上司姓名。使用左外连接就可以避免这一情况。
查询结果:
员工姓名 | 上司姓名 |
胡九 | 王五 |
赵六 | 王五 |
张三 | 王五 |
周八 | 吴七 |
李四 | 吴七 |
王五 | 杨二 |
杨二 | 刘一 |
陈十 | 刘一 |
吴七 | 刘一 |
刘一 |
查询结果都是一样的,只是最后显示出来的顺序不一样。