SQL之双重not exists
答案:
select sname from s where not exists (select * from c where teacher = '程军' and not exists (select * from sc where c.cno = sc.cno and sc.sno = s.sno));
怎么写这道题呢?首先我们知道题意问的就是选择 学生选了程军老师教授的全部课程,我们知道正常情况我们用sql不好解决,因为判断一个学生是否学过程军老师的所有课程不好搞,我们可以采用逆否命题形式,也就是 不存在学生没选过程军老师教授的全部课程(注意:没学过程军老师教的全部课程不代表没学过程军老师教的课,只是没全选)。
具体的:首先我们找到学生学过的课程的数据集(select * from sc where sc.sno = s.sno),然后找到学生没学过的课程(select * from sc where c.cno = sc.cno and sc.sno = s.sno),以及是程军老师教的且学生没学过的课程(select * from c where teacher = '程军' and not exists (select * from sc where c.cno = sc.cno and sc.sno = s.sno)),如果这个同学不存在是程军老师教的且学生没学过的课程,那么他的程军老师教的且学生没学过的课为空集,那就是程军老师教的课都学过。