帮我分析一下代码需要改进的地方

帮我分析一下代码需要改进的地方

问题:

https://img1.sycdn.imooc.com//climg/61767e1d0996631225601600.jpg


代码:

SELECT d1.empno,d1.ename,d1.deptno,d1.sal,d1.grade,d1.time,d1.mgr,d2.ename,d2.dname 

FROM 

(SELECT e.empno,e.ename,d.deptno,e.sal,s.grade,

TIMEDIFF(NOW(),e.hiredate) AS time,e.mgr

FROM t_emp e JOIN t_dept d JOIN t_salgrade s

ON e.deptno=d.deptno 

AND s.losal<e.sal<s.hisal) d1

JOIN

(SELECT e1.mgr,e2.ename,t.dname

FROM t_emp e1 JOIN t_emp e2 JOIN t_dept t

ON e1.mgr=e2.empno AND e1.deptno=t.deptno) d2


ON d1.mgr=d2.mgr;


表截图:

https://img1.sycdn.imooc.com//climg/61767fc3094f5c1725601600.jpg

https://img1.sycdn.imooc.com//climg/61767fcf09fa39b325601600.jpg

https://img1.sycdn.imooc.com//climg/61767fda092bb8a725601600.jpg


代码截图:

https://img1.sycdn.imooc.com//climg/61767f9e0960bc5d25601600.jpg


希望得到的帮助:

  1. 为什么我可以查出205条记录(右下角)

  2. 为什么我所有时间都为空

  3. 分析一下其他需要修改的地方


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

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

1回答
好帮手慕小尤 2021-10-25 18:29:39

同学你好,使用同学的sql语句会查询到重复的数据,所以查询数据比较多(205条)如下所示:

https://img1.sycdn.imooc.com//climg/6176810609988cda08190519.jpg

则建议同学进行调整sql,直接使用连接表进行查询。如下所示:

select e1.empno,e1.ename,d.dname,e1.sal,s.grade,datediff(now(),e1.hiredate),e.ename,e.empno ,d1.dname
from t_emp e1 
	left join t_dept d on e1.deptno = d.deptno
	left join t_salgrade s on e1.sal between s.losal and s.hisal
	left join t_emp e on e.empno = e1.mgr
	left join t_dept d1 on e.deptno = d1.deptno

祝学习愉快!

  • 提问者 Star3327752 #1

    我还有其他两个问题
    1.为什么我的工龄查询那里为空
    2.能不能帮我分析一下我的代码哪里可以改进

    2021-10-25 18:31:10
  • 好帮手慕小尤 回复 提问者 Star3327752 #2

    同学你好,1、now代表的是完整的日期时间(年月日时分秒),与hiredate字段中格式不符,所以导致工龄哪里没有数据。如下所示:

    https://img1.sycdn.imooc.com//climg/6177652109f559b806200368.jpg

    建议同学使用datediff函数进行计算。

    2、同学代码出现重复的查询,则建议同学直接使用join进行连接,同学可以参考上方回答中的SQL。如果想要在现有的sql中进行修改,则建议同学删除from中的连接查询,直接通过t_emp表进行查询。并在最后连接t_salgrade表。参考SQL如下所示:

    https://img1.sycdn.imooc.com//climg/617766100900279009510231.jpg

    SELECT e.empno,e.ename,d2.deptno,e.sal,s.grade,datediff(NOW(),e.hiredate) AS time,d2.mgr,d2.ename,d2.dname 
    FROM t_emp e
     left JOIN
    	(SELECT e1.mgr,e2.ename,t.dname,t.deptno 
    	FROM t_emp e1 JOIN t_emp e2 JOIN t_dept t
    	ON e1.mgr=e2.empno AND e1.deptno=t.deptno) d2
      ON e.mgr=d2.mgr
    left JOIN t_salgrade s on e.sal between s.losal and s.hisal;

    祝学习愉快!

    2021-10-26 10:22:17
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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