sql查询至少选修了学生202019122选修的全部课程的学生号码

问题:查询至少选修了学生202019122选修的全部课程的学生号码
解题思路:用逻辑蕴含表达这个查询

  • 用p表示谓词"学生202019122选修了课程y"
  • 用q表示谓词"学生x选修了课程y"
  • 则上述查询为(∀y)p → q

等价变换(这一部分会较难理解):
(∀y)p → q ≡ ┐(∃y ( ┐(p → q ) ) ≡ ┐(∃y(┐(┐p Vq))) ≡┐∃y(p∧┐q)
解析:

  • (∀y)p → q :所有的课程y,只要202019122学生选修了课程y,则x也选修了课程y

  • 变换后的语义┐∃y(p∧┐q):不存在这样的课程y,学生202019122选修了课程y,而学生x没有选。

SELECT DISTINCT StudentCourseX.Sno
FROM StudentCourse StudentCourseX
WHERE NOT EXISTS(
     SELECT * 
     FROM StudentCourse StudentCourseY
     WHERE StudentCourseY.Sno='202019122' AND NOT EXISTS(
          SELECT *
          FROM  StudentCourse  StudentCourseZ
          WHERE  StudentCourseZ.Sno=StudentCourseX.Sno
       AND  StudentCourseZ.Cno= StudentCourseY.Cno))
  • 首先对 StudentCourseX中的第一条记录(202019122),StudentCourseY的第一条记录Sno='202019122’进行判断,结果有数据返回,所以NOT EXISTS的值为假;
  • 然后对 StudentCourseY的下一条Sno='202019122’的记录进行判断,直到查询完所有的 StudentCourseY的Sno=‘202019122’,NOT EXISTS的值始终为假,则中间层的WHERE的值为假,最外层的NOT EXISTS的值为真;
  • 再对 StudentCourseX中的下一条记录进行查询,直到查询完 StudentCourseX表中所有数据。
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值