数据库sql语句查询选修了全部课程的学⽣姓名。
SELECT Sname
sql语句查询结果取反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个WHER E收到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,所以李四被放进第⼀个查询的结果表。得到选修全部课程的学⽣-李四。
主要思想:将“选修了所有课程的学⽣”转化为“没有⼀门课程不选修的学⽣”。查询到该学⽣存在没有选修的课程,
则该学⽣不会被放⼊结果集中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。