早教吧 育儿知识 作业答案 考试题库 百科 知识分享

selectsname    from swhere notexists(select*    fromc   wherenotexists(select*    fromsc    wheres.sno=sc.sno  andsc.c

题目详情
select sname     from  s where  not exists
( select *    from c   where not exists
(select *    from sc    where s.sno=sc.sno  and sc.cno=c.cno));
原题是这样的:Find the students who take all the courses and list their names.(相当于查询这样的学生,没有一门课是他不选的)
上面的是答案,但是不知道not exists怎么理解
▼优质解答
答案和解析
exists 与 not exists存在谓词,判断并返回布尔类型结果.
select sname from s
where not exists (select * from c where not exists (select * from sc where s.sno=sc.sno and sc.cno=c.cno));
下面这句你把where后面的连接条件去掉理解就是选了课的所有课号和学号,
select * from sc where s.sno=sc.sno and sc.cno=c.cno
下面这句把WHERE 后面的SNO的连接条件去掉理解就是
没有被选的课程信息
select * from c where not exists (select * from sc where s.sno=sc.sno and sc.cno=c.cno));
因为这个关系模式牵扯到三个表,整个代码中的WHERE都是连接条件,你不要在这里钻牛角尖.
整个句子是这个意思,
S表不存在这样的人(姓名),他的学号在SC表里出现,他的SC表的课号没有在C表出现.
换个角度理解就是这个学号的SC表的课号全部在C表出现了,那么这个学号就是选了所有课的学号,根据学号,又能从S表获得姓名.
两个否定逻辑判断推出肯定的学生姓名.