【数据库】SQL的EXIST双重否定解读
SQL的EXIST双重否定解读
现有关系模式如下:
学生(学号,姓名,性别,年龄);
课程(课程号,课程名,教师姓名);
选课表(课程号,学号,选课时间,成绩)
题目要求为
假定不存在重修的情况,求选修了所有课程的学生的学号姓名。
我们可以用如下sql语句达到题目要求
SELECT 学号,姓名
FROM 学生
/*如果没有一门课该学生没有选,那么就选了所有课*/
WHERE NOT EXISTS(
/*选出课表中该学生没有选的所有课*/
SELECT *
FROM 课程
WHERE NOT EXISTS(
/*该学生选的所有课*/
SELECT *
FROM 选课表
WHERE 选课表.学号=学生.学号
AND 课程.课程号=选课表.课程号
)
)
如果不看注释,乍看一下会比较晕
我们可以分两步看,就明白了双重否定的奥妙。
- 所有课程 = 没有 没有选的课程 = NOT EXISTS 没有选的课程
- 没有选的课程 = NOT EXISTS 选了的所有课程

浙公网安备 33010602011771号