Not exists嵌套调用例子

查询选修了所有课程的学生的学号,姓名,年龄

select sno,sname,datediff(YYYY,birthdate,getdate()) 年龄
from student
where not exists(select *      
     from course
        where not exists(select *
          from sc
          where sno=student.sno
and SC.CNo=course.cno));

 

这个查询,查出的是选择全部课程的学生的姓名。
对于这个语法,要分步理解,从最下边的where看起,从下往上去看。

最下边的一个select(not exists后边)是把学生编号和课程编号带入,结果是查询学生选课的记录。加上not exists,就是学生没选课,那么加上前边的从课程表的select,就是查询出学生没选的课程。最后在上面又加了一个not exists,那么就是不存在没选课程的数据,也就是说,这个学生选择了所有的课程,才会符合记录。
这么说能明白么?看我下边分的段

----------------以下查询选择全部课程学生的姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS --------此处不存在配合以上STUDENT,可知查询的是不存在没选课的学生
----------------以下查询学生没选课的信息
(SELECT *
FROM Course
WHERE
NOT EXISTS -------此处增加不存在,配合上面从COURSE的选择可知查询的是学生没有选的课
----------------以下查询查询学生选课的信息
(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = Course.Cno
)
);

 

posted @ 2012-04-26 16:48  superqbb  阅读(704)  评论(0编辑  收藏  举报