数据库系统原理——对比与解析查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名和查询至少选修了学号为“0700001”学生所选修的所有课程的学生姓名。

一、【问题描述】

用SQL语句完成下列数据查询操作
1.查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名。
2.查询至少选修了学号为“0700001”学生所选修的所有课程的学生姓名。

二、【问题解答】

问题解析:因为在第一题的要求中是要查询至少有一门课与学号为‘0700001’的学生相同的学生学号和姓名,因此查询的结果中学生只要有一门课程或者一门课程以上选修的与‘0700001’的学生相同即可,所以只要先查询出‘0700001’学生所选修的课程的课程号,然后再对比看看哪些学生选修的课程的课程号与他相同,很容易想到SQL语句中要用上IN。

SQL语句如下:

select distinct studentName,Student.studentNo
from Student,Score
where Student.studentNo=Score.studentNo and courseNo in(select courseNo from Score where studentNo='0700001')

问题解析:在第二题中的要求是要查询出至少选修了学号为“0700001”学生所选修的所有课程的学生姓名,注意这里的至少,分析题意就是所查询的学生选修了学号为‘0700001’的全部课程或者除了选修他的全部课程,也可以选修了多余的课程,但是至少是要选修了他选修的全部课程的。在SQL中没有全称量词,因此要解决这个问题就要用上否定的否定,就要用到not exists

SQL语句如下:

select distinct studentName from Student,Score X
where Student.studentNo=X.studentNo and not exists(select * from Score Y where Y.studentNo='0700001' and not exists(select *from Score z where
z.studentNo=X.studentNo and z.courseNo=Y.courseNo))

其实以上SQL代码的核心是:

select *
from Score X,Score Y,Score z
where z.courseNo=Y.courseNo and 
z.studentNo=X.studentNo
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值