查询选修了课程表中所有课的同学的学号、姓名

【表名和字段】

有如下几个表,分析问题选择合适的表进行查询

  • 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) 
	)

查询结果

sidsname
1舒宜
3刘洋
  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值