双层 not exist 嵌套

来源:互联网 发布:ocr软件手机版 编辑:程序博客网 时间:2024/04/29 12:00

STUDENT:

CREATE TABLE `student` (    `STUID` varchar(40) DEFAULT NULL,    `STUNAME` varchar(100) DEFAULT NULL,  )  

COURSE:

CREATE TABLE `course` (    `COURSEID` varchar(40) DEFAULT NULL,    `COURSENAME` varchar(100) DEFAULT NULL  )   

REGISTER:

CREATE TABLE `register` (    `STUID` varchar(40) DEFAULT NULL,    `COURSEID` varchar(40) DEFAULT NULL,    `GRADE` smallint(6) DEFAULT NULL  )  

问题:检索选读全部课程的学生姓名

SELECT STUNAME FROM STUDENT      WHERE NOT EXISTS (          SELECT * FROM COURSE WHERE NOT EXISTS (              SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  register.STUID =STUDENT.STUID)      )  

现在我们从后面的子查询向前分解:

1.所有未选过的课程的数据集:

SELECT * FROM COURSE WHERE NOT EXISTS (      SELECT * FROM register WHERE COURSEID = COURSE.COURSEID)  

2.所有没被某位学号为 @STUID 的学生选过的课程的记录集(@STUID学生的未选课程):

SELECT * FROM COURSE WHERE NOT EXISTS (      SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  STUID =@STUID)  

3.遍历每一个主查询的学号,每一个学号都按第二筛选方法筛选出:没有未选课程的学生的学号。(不包括在第查询方法查询出的“有未学课程的学号的记录集”中的记录。)
请注意:用主查询中的 学生.学号 代替了@STUID。

SELECT STUNAME FROM STUDENT      WHERE NOT EXISTS (          SELECT * FROM COURSE WHERE NOT EXISTS (              SELECT * FROM register WHERE register.COURSEID = COURSE.COURSEID AND  register.STUID =STUDENT.STUID)      )  

这已经是整个查询语句,可以看出子查询中用学生.学号替换了第2步中的 @STUID,(没忘了吧,第二步求的是没有选修全部课程的某个学生)。

from http://blog.csdn.net/beiyetengqing

0 0
原创粉丝点击