确切的说加上exists的判断,可以防止报错,是一种mysql扩展
现在我们来分析一下题主的问题。
先来看看书中的语句
SELECT cname FROM course WHERE NOT exists(SELECT * FROM sc,student WHERE sc.sno=student.sno AND
sc.cno=course.cno AND ssex='男')
这是一个父子关联 not exists 非存在子查询。我们知道父子关联exists子查询可检索出主查询结果集(父)中与子查询结果集(子)的“交集”,加上关键字not则取反,返回父中与子的“非交集”。
那么上述语句的实际上是返回课程表"course"中所有的课程中与被男生选修过课程的“非交集”。也就是在剩下的未被男生选修过的课程列表里,即可能存在被女生选修过的课程,也可能存在男生和女生都没有选修过的课程。从这个角度来看书中的SQL语句的运行结果是正确的,数据库引擎运算不存在BUG。
如果书中说“选出未被男生选读的课程名单”上述语句是正确的,如果以此反推未被男生选过的课程就是“只有女生选过的课程”就不够严谨,因为这正如上面所说过的那样,男生未选读的课程还可能包含女生也未选读的课程。严格来讲,要列出“只有女生选读的课程”,除了要排除男生外,还要排除女生未选读的课程。题主的第二个语句对主表做了进一步筛选因此有了不一样的效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)