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,(没忘了吧,第二步求的是没有选修全部课程的某个学生)。