求出选修了所有课程的学生姓名
学生表 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不是同一个意思。该生泛指符合条件的学生。
因篇幅问题不能全部显示,请点此查看更多更全内容