【转】带存在量词NOT EXISTS的SQL语句问题

带存在量词NOT EXISTS的SQL语句问题

学生表student (sno学号 sname姓名 sdept所在系)

课程表course (cno课程号 cname课程名 cpno选修课号 ccredit学分)

学生选课表sc (sn0学号 cno课程号 grade成绩)

对以上表进行查寻选修了全部课程的学生姓名

由于不,没有全称量词,可将题目的意思转换为等价的存在量词形式:查询这样的学生,没有一门课程是他不选修的

 

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以后又向上级查询返回真还是假?

为什么有这样的问题呢?因为我的判断(当然是错误的了)是当找到了学习全部课程的学生以后,返回了假,这似乎是在找没有选修全部课程的学生,最终应当将结果取反才能得到选修了全部课程的学生的学号。

我的逻辑关系已经乱了,所以希望指点我的高人说细一点,解释地透彻一点,谢谢了

 

网友回答:

网友:w_rose

“全称量词”很自然地需要转换为not exists来处理。逻辑表达中,不需要“全称量词”,只表达“何物存在”就可以了。any xxx等价于exist xxx的“矛盾句子被否定”。逻辑中,如果去掉显式的“全称量词”,可以避免很多空洞、含糊的描述形式。

 

“学生x选修了全部课程”,转换为以下这个查询被否定。这个查询就是:存在课程y,x没有选修y。

 

了解了逻辑涵义,关于所谓“内部运行方式”就比较好说了。这是“相关子查询”,即内层的查询关联外层查询的结果,所以查询规划首先是对外层进行查询,然后再处理内层的匹配记录。相当于以下伪代码:

 

for each x in student

if 判断学生(x) then print x

next

 

function 判断学生(x)

for each y in course

if exists select (* from sc where 学生=x and 课程=y) return false

next

return true

end function

 

最初ibm开发的sql只有exists和not exists相关子查询并且认为足够了,以后为了用户方便才增加了in、all、any等等,用户可以使用扩展的形式简化语句。

--------------------------------------------

http://hi.baidu.com/forgiveher/blog/item/0d111d954bf20414d21b700f.html-

你可能感兴趣的:(【转】带存在量词NOT EXISTS的SQL语句问题)