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

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

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

EXISTS:查询有结果则返回真值,查询为空则返回false。
NOT EXISTS:查询有结果返回false,查询为空返回true。
Exists执行的流程Exists首先执行外层查询,再执行内存查询,与IN相反。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/991368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存