2 jokelover JokeLover 于 2016.05.06 10:36 提问

初学数据库,有点不懂数据库查询问题exists

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的含义

5个回答

bdmh
bdmh   Ds   Rxr 2016.05.06 10:42

加了not就代表相反,就是不存在的意思

Myc_CSDN
Myc_CSDN   2016.05.06 10:45

你的父查询的结果中不能包含子查询里查出的结果。不包含的意思。(我也是略懂)

u012216727
u012216727   Ds   Rxr 2016.05.06 10:45

not exists就是不存在的意思。
你从最里面的括号看起,先是查询得到几组数据。然后看外面的第二层,也就是course中不是你前面查询得到的几组数据作为这一层的数据。然后到最外面一层
也就是第一个not exists,select sname from student where not exists(上一层的数据)。
也就是从student中查询sname的数据不是上一层查询得到的数据的某个。

JokeLover
JokeLover 回复大河行脚: 你能帮我一层一层分析一下吗?
一年多之前 回复
u012216727
u012216727   Ds   Rxr 2016.05.06 10:51

你可以把这条语句分开写,然后再一条一条的执行,你就能看见效果了。别人说的你也是听不懂的。
第一条select * from sc where sno=student.sno and cno=course.cno
第二条select * from course where not exists 第一条的数据
第三条select sname from student where not exists 第二条的数据

u012216727
u012216727 关于数据库的优化,等你熟练了或者做项目的时候可以考虑考虑。
一年多之前 回复
u012216727
u012216727 假设第一条查询得到的是3;则在第二条里条件是:not exists 3也就是不存在3的数据,也就是4,5;而到了第三条查询语句则是not exists (4,5),而表student里只有4是共有的,所以最终查询得到的是7和9数据。
一年多之前 回复
u012216727
u012216727 比如说sc表里数据是1,2,3;course表里是3,4,5;student表里是4,7,9;
一年多之前 回复
u012216727
u012216727 第一条你根据where后面的条件得到某些数据;然后第二条就是在course表里不存在这些数据(第一条查询的数据)的数据将被选出来;然后第三条就是student表里不存在你第二条查询的数据的数据
一年多之前 回复
JokeLover
JokeLover 回复大河行脚: 第一个是 有选课的人 第二个是 没有选课的人 第三个是选了所有课的人 对吧?是这个意思吧?
一年多之前 回复
yicp123
yicp123   2016.05.06 14:11

赞同楼上的意见,关于数据库的优化问题,请访问http://www.data.5helpyou.com/,希望能给你提供帮助

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!