今天刷50道sql语句题,遇到了一个很有意思的问题,原题如下
![8cc4e6818bf94b3e217993bc7faa278e.png](https://img-blog.csdnimg.cn/img_convert/8cc4e6818bf94b3e217993bc7faa278e.png)
这是一道非常经典的4表查询问题(学生表s,课程表c,成绩表sc,老师表t),那按照我的思路,我想
1.用一条sql语句查询出叶平老师教的课程的数量
2.再用一条语句查询出学生学的叶平老师课程的数量
3。如果他们两个的数量是相等的,不就证明该学生学习了叶平老师的所有课了吗
然后我的查询语句如下:
select Sid,Sname from student where Sid in
(
select Sid from sc,course c,teacher t where sc.Cid = c.Cid and t.Tid = c.Tid and t.Tname = "叶平" group by Sid having count(c.Cid)
=
(select count(c.Cid) from teacher t,course c where t.Tname = "叶平" and c.Tid = t.Tid)
)
按逻辑来说,其实是没问题的。官方给出的答案更简洁,但不太容易理解,如下:
SELECT s.Sid,s.Sname
from student s
where not EXISTS
(
select c.Cid from course c where c.Tid =
(select t.Tid from teacher t where t.Tname ="叶平")
and c.Cid not in
(select sc.Cid from sc where sc.Sid = s.Sid)
)
然后我执行各自的语句,结果官方的答案查询多出来一条数据。我对照了表内容,发现确实是官方的是正确的。但我觉得我的逻辑也没有错,一时陷入懵逼状态。我逐句分析了我的sql语句,并对照成绩表(sc)内的内容。发现了问题出在哪里。
原来成绩表里有一个学生,选的叶平老师的同一门课,但是却有两次成绩
![77e00fbaeaf762d968434a906dae7caf.png](https://img-blog.csdnimg.cn/img_convert/77e00fbaeaf762d968434a906dae7caf.png)
这就导致了我的语句在count(c.cid)的时候多出来一条数据,所以该学生就比老师教的课程多出来一门。导致了不相等。出现错误。
当然,如果按照实际情况,该学生一门课是可以有两次成绩的,比如学生挂科补考的成绩。
所以,官方的答案还是更准确的。
最后贴一下题目的链接吧。倾删!
数据库之 MySQL-- 50个查询系列blog.csdn.net![b64ec6fb9bf9b027a26cc4dde187113d.png](https://img-blog.csdnimg.cn/img_convert/b64ec6fb9bf9b027a26cc4dde187113d.png)