为什么当"陈浩"的deptno不为Null的时候,COUNT(*)依然会多一个呢?

为什么当"陈浩"的deptno不为Null的时候,COUNT(*)依然会多一个呢?

根据老师的说法,两表在做链接的时候,右表用Null值链接。以下代码运行后,OPERATIONS(4号部门)会多一个计数:

select d.dname,COUNT(*) from t_dept d left join t_emp e on d.deptno=e.deptno GROUP BY d.deptno;

我在测试时更改陈浩的deptno为10,重新执行上述代码,ACCOUNTING(1号部门)多一个计数,t_emp表里已经没有deptno为Null的记录了,为什么OPERATIONS依然会多出一个呢?


相关截图:

https://img1.sycdn.imooc.com//climg/619027bb09c3e84306960416.jpg


https://img1.sycdn.imooc.com//climg/6190278a0903f57002440160.jpg


注:t_emp共有15条记录

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2021-11-14 14:31:39

同学你好,同学sql语句的运行结果是正确的。同学所说的count(*)会多一个指的是:count(*)列的总数4+5+6+1=16比t_emp表的总记录数多一吗?

两表连接后记录总数为16条,结果如下:

select * from t_dept d left join t_emp e on d.deptno=e.deptno

https://img1.sycdn.imooc.com//climg/6190ac6809e9fe7217280722.jpg

上述表中总共有16条数据,其中部门10、20、30、40分别有4、5、6、1条数据

select d.deptno,d.dname,COUNT(*) from t_dept d left join t_emp e on d.deptno=e.deptno 
GROUP BY d.deptno;

https://img1.sycdn.imooc.com//climg/6190ad0d09d2bf8d14970326.jpg

祝学习愉快~

  • 提问者 星光下的你和我 #1
    谢谢回复!我的疑问是,员工中所有的记录都不为null,且没有一个在40部门,为什么40代表的operation经过count(*)计算后会得到1呢?这个count(para)里面para参数如何使用我还不是很理解
    2021-11-14 15:06:34
  • 提问者 星光下的你和我 #2
    count(*)这么写的话,计算的是t_dept表(我们假设sql是t_dept left join...)中10,20,30,40部门deptno=t_emp.deptno的员工数量,前三个计数都没问题,40部门没有员工对应,所以默认会和null对应,这里的null不是指员工的deptno是否为null,而是40部门在连接表的时候就会默认有一个全为null的记录,假如有属于40的员工就添加记录去覆盖null,我的理解对吗?
    2021-11-14 15:16:15
  • 同学你好,上述count(*)指的是中间表中deptno为40的记录条数,在执行完sql语句后,得到的中间表中是存在一条deptno为40的记录的,所以得到结果为1。

    select * from t_dept d left join t_emp e on d.deptno=e.deptno

    https://img1.sycdn.imooc.com//climg/6190b694098ca12517280805.jpg

    若不记录没有员工的部门,则可以使用表右连接,统计结果如下:

    select d.deptno,d.dname,COUNT(*) from t_dept d right join t_emp e on d.deptno=e.deptno 
    GROUP BY d.deptno;

    https://img1.sycdn.imooc.com//climg/6190b79709bca97814350261.jpg

    使用表的右连接或者将两表互换位置得到的中间表结果如下:

    select * from t_dept d right join t_emp e on d.deptno=e.deptno

    https://img1.sycdn.imooc.com//climg/6190b7390902cfdc12290597.jpg

    select * from t_emp e left join t_dept d on d.deptno=e.deptno

    https://img1.sycdn.imooc.com//climg/6190b701091315c612140663.jpg

    祝学习愉快~

    2021-11-14 15:23:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师