一个错误例子带你深入理解数据库“自联接”查询

情景:

员工表emp,表内包含①员工编号empno②员工姓名ename③员工的上级领导编号mgr

sql语句如下:

select empno,ename,mgr from emp

一个错误例子带你深入理解数据库“自联接”查询

select a.empno,a.ename,b.ename as 领导
from emp a
join emp b
on a.mgr = b.empno;

一个错误例子带你深入理解数据库“自联接”查询
到这里,有自联接基础的小伙伴应该不难理解我是在做:查询员工的上级领导。

那么,错误例子到底在哪呢?

思考,如果以上语句中的on a.mgr = b.empno的部分,把on联接条件换成a.empno= b.mgr,那么查询结果会截然不同!大错特错。
以下,为错误示例图:
一个错误例子带你深入理解数据库“自联接”查询
不难发现,员工姓名和领导的信息对调。
那么,问题来了:我们只是在操作一张表,只是对表设置两个不同的别名,为什么交换empno和mgr的顺序会出现错误?这在笔试中在我们无法上机验证我们写的到底是否是有效的sql语句的情况下,该如何解决。错误到底出现到了哪里?留给大家思考。(望评论)

自联接

查询范围在一张表中,对一张表设置两个不同的表别名a,b。能实现查询一列中重名的学生,查询多列中员工与领导的所属关系。

一. 使用同一列进行自联接

栗子:查询重名学生
已知:学生表student,表内信息①学生姓名sname②学生编号sid

select a.,b.
from student a join student b
on a.sname=b.sname

到这里,查询结果集是原表的数据+重名学生的数据,切勿忘记用where进行条件筛选,完整最终查询重名学生sql语句如下:

select a.,b.
from student a join student b
on a.sname=b.sname
where a.sid<>b.sid

二. 使用不同列进行自联接

详见开头