mysql 用法:
1. 最常用的if not exists用法: create tableif not exists AA 如果表AA不存在(返回true)则创建表
2. select 语句中使用exists, 如:
select a.id,a.name from user where exists (select * from class where a.class_id = c.class_id)
3. insert into中使用not exists, 为了表中不插入重复语句,可以在insert into 中使用not exists进行判断,如果不存在相同的记录(not exists返回true)则插入,否则不执行,语句如下:
insert into tableA(id,name,start_time,ds)
select '1234','testName','2017-07-01 18:00:00','20170701 ' from dual WHERE not exists (select * from tableA
where instance_id = '1234' )
现在我们来分析一下题主的问题。
先来看看书中的语句
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条)