失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 数据库sql语句查询选修了全部课程的学生姓名。

数据库sql语句查询选修了全部课程的学生姓名。

时间:2021-06-18 12:30:09

相关推荐

数据库sql语句查询选修了全部课程的学生姓名。

SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=o) );

EXISTS:查询有结果则返回真值,查询为空则返回false。

NOT EXISTS:查询有结果返回false,查询为空返回true。

Exists执行的流程Exists首先执行外层查询,再执行内存查询,与IN相反。

假设:课程总共有 语文,数学,英语三门课程。现在有学生:张三:选修了语文,数学,没有选择英语。李四:三门课全都选修了。开始查询:一、首先从Student表中选出 张三 所在元组(也就是张三所在行),接着依次从Course表取出三门课程,1、首先取出语文课满足"Sno=Student.Sno AND Cno=o"条件,即查询到了结果,则第2个NOT EXISTS返回结果false,第1个WHERE收到false,不执行任何操作。2、接着判断数学,同样满足,第一个WHERE不执行任何操作。3、最后拿出英语,"SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=o"语句查询不到结果,则第2个NOT EXISTS返回ture,第1个WHERE收到true,则将结果(也就是英语课程)放入结果表,也就是"SELECT * FROM Course"结果不为空, 第一个NOT EXISTS返回false,那么张三就不会被放进第一个查询的结果表,即张三没有被选中。二、从Student表中选出 李四 所在元组,接着依次从Course表取出三门课程,因为李四三门课全都选修了,取出的三门课都满足"Sno=Student.Sno AND Cno=o"条件,即查询到了结果,则第2个NOT EXISTS都返回结果false,第1个WHERE收到false,都不执行任何操作。最后循环结束时,"SELECT * FROM Course"没有任何结果,即没有一门课被加入第二个查询结果表中,结果为空,则第一个NOT EXISTS返回true,所以李四被放进第一个查询的结果表。得到选修全部课程的学生-李四。

主要思想:将“选修了所有课程的学生”转化为“没有一门课程不选修的学生”。查询到该学生存在没有选修的课程,则该学生不会被放入结果集中。

如果觉得《数据库sql语句查询选修了全部课程的学生姓名。》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。