求出选修了所有课程的学生姓名

求出选修了所有课程的学生姓名

学生表 S(SNO int pk,SN varchar(8))  --SNO为学号 ,SN为学生姓名。
课程表 C(CNO int pk,CN varchar(50)) --CNO为课程号,CN为课程名
选修表 SC(SNO int pk,CNO int pk,SCORE number(7,2),fk(SNO,CNO) )  --SCORE为成绩。

--以下语句为求出选修了所有课程的学生姓名.
SELECT SN
FROM s
WHERE (NOT EXISTS
          (SELECT *
         FROM c
         WHERE NOT EXISTS
                   (SELECT *
                  FROM sc
                  WHERE SNO = S.SNO AND CNO = C.CNO)))

解释:没有任何一门课程不再该生所选的课程中。

小朋友不会原因是不知道字段的访问规则,join 的查询中后面的表可以用前面表中的字段作为条件。在嵌套查询中子查询可以使用父查询表中的字段作为条件。

类似的题型还有:

1、求至少选修了学生学号为S003所选修的所有课程的学生姓名和学号。

 SELECT distinct SN,SNo

FROM SC SC2

WHERE (NOT EXISTS

          (SELECT CNO

         FROM SC SC1

         WHERE  SNO='S003' and CNO not in

                   (select Cno from Sc where SC2.SNO=Sc.SNo)))

解释:

     没有任何一门学号为S003学生所选修的课程编号不在该生所选的课程的编号中中。

注意此处该生与S003不是同一个意思。该生泛指符合条件的学生。

 

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值