双层 not exist 嵌套

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值