求出选修了所有课程的学生姓名
学生表 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不是同一个意思。该生泛指符合条件的学生。
转载于:https://blog.51cto.com/encorearon/434939