关于练习中查询1 的问题

关于练习中查询1 的问题


相关代码:


select  DISTINCT s1.Sname from student s1 join 

(select DISTINCT s.Sname from student s join  sc c on s.S = c.S join 

Course cou

on c.C = cou.C join teacher t on cou.t =  t.T 

where t.Tname ="张三"

GROUP BY s.Sname) ss on s1.Sname not in (ss.Sname)

相关截图:

https://img1.sycdn.imooc.com//climg/615fa0af0906bd3915740742.jpg

问题描述:

并不能查询出想要的结果,请问老师为什么这样写不行呢,最简单快捷的方法是什么呢


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

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

1回答
好帮手慕小小 2021-10-08 13:14:30

同学你好,可以尝试使用如下sql语句实现查询没学过"张三"老师授课的同学的信息:

SELECT * 
FROM student 
WHERE student.S NOT IN(
    SELECT S FROM 
        (SELECT stu.S,stu.Sname,sc.C FROM student stu LEFT JOIN sc ON stu.S = sc.S) temp
    LEFT JOIN course c ON temp.C = c.C
    LEFT JOIN teacher t ON t.T = c.T
    WHERE t.Tname="张三")

查询学过张三课程的学生信息:

SELECT 
    temp.S,temp.Sname,c.Cname,t.Tname
FROM 
    (SELECT stu.S,stu.Sname,sc.C FROM student stu LEFT JOIN sc ON stu.S = sc.S) temp
LEFT JOIN course c ON temp.C = c.C
LEFT JOIN teacher t ON t.T = c.T
WHERE t.Tname="张三"

祝学习愉快~

  • 提问者 应该怎么爱 #1

    请问老师这是不是属于where子句里的子查询呢,会对运行速度有影响吗

    2021-10-08 13:28:42
  • 好帮手慕小小 回复 提问者 应该怎么爱 #2

    同学你好,where子查询会对执行效率有一定的影响,也可尝试如下方式实现:

    SELECT s1.S,s1.Sname
    FROM student s1 
    LEFT JOIN (SELECT DISTINCT s.S,s.Sname,c.C,t.Tname FROM student s 
    		JOIN sc c ON s.S = c.S 
    		JOIN Course cou ON c.C = cou.C 
    		JOIN teacher t ON cou.t =  t.T 
    		WHERE t.Tname="张三"
    		GROUP BY s.Sname) ss 
    ON s1.S=ss.S
    WHERE ss.S IS NULL;

    运行结果如下:

    https://img1.sycdn.imooc.com//climg/615fe49309ca519c09850550.jpg

    https://img1.sycdn.imooc.com//climg/615fe4a609a3d7e309840424.jpg

    祝学习愉快~

    2021-10-08 14:32:26
  • 最后的那个WHERE ss.S IS NULL不太明白,为什么会是空值
    2021-11-13 19:45:04
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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