
exists子句有两种用法,一种为独立exists子查询,另一种是父子关联子查询。前者对父查询不构成筛选作用,子查询若果有记录存在的话则输出所有的父查询记录集,反之则父查询输出空记录集。后者会对父查询构成筛选作用,不使用not关键字的情况下输出父查询中与子查询的交集,而使用not时则输出父查询中与子查询的非交集。至于如何判断exists子查询属于独立还是父子关联查询,以及为什么父子关联exists子查询会对父查询构成筛选作用,解释起来需要很大的篇幅这里就不讲了。反正我们记住父子关联查询的最常用功能就是它可以求出两张表的交集或非交集(使用not关键字)和不使用group分组的情况下求出某张表的最大值或最小值。
现在回到题主的具体问题上,这个问题涉及到三张表,学生表student、选课表sc、课程表course。
提问要求列出选取了所有课程的学生名单。
下面是提问中给出的sql语句:
select sname from student
where not exists(
select * from course
where not exists(
select * from sc
where sno=student.sno
and cno=course.cno))
从该语句我们看到它使用了两个嵌套父子关联不存在判断not exists子句,显然是要通过求非交集的方法查出选修了所有课程的学生名单。
一个学生如果他至少有一门课程没有选修,那么他在课程表里就会存在与选课表的非交集,我们姑且称之为“未选所有课程学生名单子集”,它由内层的not exists选出
...
select * from course
where not exists(
select * from sc
sno=student.sno
and cno=course.cno) ...
这个内层父子关联存在子查询选出课程表里与选课表的非交集,最内层选课表sc的课程号cno、学号sno分别与第二层父表course课程的cno、最外层父表studen学生表的sno进行对等连接,不存在对等的记录即为非交集,从而筛选出“未选所有课程学生名单子集”。
...未完待续
EXISTS在SQL中的作用是:检验查询是否返回数据。
select a.* from tb a where exists(select 1 from tb where name =a.name)返回真假,当 where 后面的条件成立,则列出数据,否则为空。
exists强调的是是否返回结果集,不要求知道返回什么。比如:select name from student where sex = 'm' and mark exists(select 1 from grade where ...)
只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1
如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。
扩展资料:Exists 方法描述如果在 Dictionary对象中指定的关键字存在,返回True,若不存在,返回False。
语法object.Exists(key)Exists 方法语法有如下几部分:部分描述Object必需的。始终是一个 Dictionary对象的名字。Key必需的,在 Dictionary对象中搜索的Key值。
exist相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.
例如 exist P表示P不空时为真not exist P表示p为空时为真in表示一个标量和一元关系的关系。
例如:s in P表示当s与P中的某个值相等时为真s not in P 表示s与P中的每一个值都不相等时为真。
exits与not exits
exists(sql 返回结果集为真)
not exists(sql 不返回结果集为真)
如果not exists子查询只有自己本身的查询条件,这样只要子查询中有数据返回,就证明是false,结果在整体执行就无返回值;一旦跟外面的查询关联上,就能准确查出数据。
参考资料:百度百科-Exists
1、数据库中没有全称量词,因此只能转化成等价的用存在量词的形式。2、通俗一点说就是你的查询目标是查询这个一个结果集:
对于这个学生【200215122】的任意一门选修课程在这个结果集中都存在。
3、但是数据库中没有全程量词(就是表达【任意】意思的关键字),只能按照下面的方式转换一下:查询没有一门【200215122】选修的课程不是他不选修的学生信息。
4、上面说的这两个不就分别对应着你的SQL文中的两个not exists
5、但是看了一下你写的SQL文,可能是我有点不聪明没有看明白,我觉得下面的写法能实现你的想法,并且很好理解,请你参考
select sname
from student
where not exists
(select * from course where not exists
(select * from sc where sno = student.sno and cno=course.cno))
6、可能我举的例子不恰当,但是看你的意图绝对符合我说的1~4条。我说的就这些了,希望对你能有所帮助。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)