【数据库】SQL的EXIST双重否定解读

SQL的EXIST双重否定解读

现有关系模式如下:

学生(学号,姓名,性别,年龄);

课程(课程号,课程名,教师姓名);

选课表(课程号,学号,选课时间,成绩)

题目要求为

假定不存在重修的情况,求选修了所有课程的学生的学号姓名。

我们可以用如下sql语句达到题目要求

SELECT 学号,姓名
FROM 学生
/*如果没有一门课该学生没有选,那么就选了所有课*/
WHERE NOT EXISTS(
	/*选出课表中该学生没有选的所有课*/
	SELECT * 
	FROM 课程 
	WHERE NOT EXISTS(
        /*该学生选的所有课*/
		SELECT * 
		FROM 选课表 
		WHERE 选课表.学号=学生.学号 
			AND 课程.课程号=选课表.课程号
	)
)

如果不看注释,乍看一下会比较晕

我们可以分两步看,就明白了双重否定的奥妙。

  1. 所有课程 = 没有 没有选的课程 = NOT EXISTS 没有选的课程
  2. 没有选的课程 = NOT EXISTS 选了的所有课程
posted @ 2021-04-06 23:27  Zeiion  阅读(969)  评论(0)    收藏  举报