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

情景:

员工表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

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

详见开头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值