【表名和字段】
有如下几个表,分析问题选择合适的表进行查询
- 1.学生表 student(sid,sname,gender,class_id)
- 学生编号,学生姓名,学生性别,班级编号
- 2.课程表course(cid,cname,tid)
- 课程编号, 课程名称, 教师编号
- 3.教师表teacher(tid,tname)
- 教师编号,教师姓名
- 4.成绩表score(sid,cid,number)
- 学生编号,课程编号,分数
- 注意sql语句中的表名要与此一致。
【要求】
查询选修了课程表中所有课的同学的学号、姓名。
【输出】
学号,姓名
分析与解答1
分析一下题意,我们要查询的是(满足一定条件的)学生的学号、姓名,这两个属性是放在student表中的
那么可以外层查询大概应该是下面这个样子
SELECT sid,sname
FROM student
WHERE ...
这样我们就得到了一些元组,这些元组是从学生表里来的,并不是所有的元组都符合我们的预期,就是说满足“选修了所有课程”
这一条件,下一步我们需要在上一步的查询结果中做一些筛选,筛选条件就是“选修了所有课程”
我们把这个命题稍微写完整一点
如果这个学生应该被保留到结果中,那么对于任意
的课程∈课程表应该被这个学生选修
前半句看起来人畜无害的样子,但是后半句马上就发生了,细心的你马上会发现在SQL没有学过全称量词
,(当然如果有人学过的话可以可以给我讲讲💡)
我们仔细研究一下这句话对于任意的课程∈课程表,应该被这个学生选修
它的否定是存在一门课程∈课程表,没有被这个学生选修
再取反就是(不)(存在一门课程∈课程表,没有被这个学生选修)
这个时候不出意外的话我们是可以想到SQL中是支持带有谓词EXISTS
/NOT EXISTS
的子查询的
此时已经涉及到课程表course和选课关系表sc了
SELECT
student.sid,
student.sname
FROM
student
WHERE
NOT EXISTS (
SELECT
*
FROM
course
WHERE
NOT EXISTS ( SELECT * FROM score WHERE sid=student.sid AND cid=course.cid)
)
查询结果
sid | sname |
---|---|
1 | 舒宜 |
3 | 刘洋 |