请问高程教程上的:用SQL查询“全部学习全部课程学生姓名”怎么理解?

warren248 2003-09-10 10:24:00
高程教程268-269:
S(S#,sname,age,sex)
SC(S#,C#,grade)
C (C#,Cname,teacher)

检索学习全部课程的学生姓名  书上写为:
select sname
from s
where not exists
( select *
from c
where not exists
(
select *
from sc
where sc.s#=s.s# and sc.c#=c.c#)
)
我就是不理解,为什么可以这么写,还有这个选择的处理过程是什么(比如说嵌套查询是最内层往外一层一层查询,可是不明白 not exists 到底怎么将查询结果送回外面一层)?谢谢!! 如果分不够可以再加!!!

...全文
146 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iceheart2000 2003-09-11
  • 打赏
  • 举报
回复
单纯的where sc.s#=s.s# and sc.c#=c.c#不能表达出已经学习的所有课程,你还是慢慢理解一下,想通了就不难的
pebble 2003-09-11
  • 打赏
  • 举报
回复
整个语句执行过程的c伪码表示,

bool where1, where2, b3;

for s.s#=1 to M{ \\遍历所有学生
for c.c#=1 to N{ \\遍历所有课程
if ( select * from sc where sc.s#=s.s# and sc.c#=c.c#的结果不为空)
b3=true;
else
b3=false;
where2=!b3 \\not exists
if(where2)
break;
}
where1= ! where2 \\not exists
if(where1){
找到一条记录,学号为s.s#德学员选修全部课程
}
}
warren248 2003-09-11
  • 打赏
  • 举报
回复
楼上大哥,能理解我就不来问了!!!还请不吝指教!!pebble(铿锵石头) 老大,我记得嵌套好像是从内层向外的,照你这么说,不成了从外向里了,不解啊。
pebble 2003-09-11
  • 打赏
  • 举报
回复
你看高程教材267页最底下,有对相关子查询的简单描述,

for sc=1 to M
warren248 2003-09-10
  • 打赏
  • 举报
回复
楼上,你好!我还是不明白!!!
我想问一下怎么理解:where sc.s#=s.s# and sc.c#=c.c# 这个条件式?
pebble 2003-09-10
  • 打赏
  • 举报
回复
这是一个相关子查询,
查询过程这样处理,从外向内
首先,执行第一层,执行select * from s,获得一条学员纪录
然后,进入第二层,执行select * from c,获得一条选课纪录
然后,进入第三层,执行select * from sc where sc.s#=s.s# and sc.c#=c.c#
其中的s.s# 和 c.c#都是上面两层执行的结果,执行完毕后,如果有满足条件的纪录
那么第二层的select语句中的where 语句中的not exists会返回假,如果没有满足条件的纪录,则第二层的where会返回真,
然后返回第二层,再次执行第二层,获得一条选课纪录,
然后,进入第三层,执行
当第二层执行完成,也就是课程信息循环完毕后,返回第一层,执行第一层,又获得一条学员纪录,
重复开始的过程,直到所有学员纪录循环完毕,
这里面主要使用了相关子查询的嵌套
大体过程是这样,我好像也说不太清楚,你自己慢慢领回吧,呵呵
iceheart2000 2003-09-10
  • 打赏
  • 举报
回复
应该是:
SELECT那些学生
那些呢?
不存在他没选过的课的那些
那里面的 select *
from c
where not exists
(
select *
from sc
where sc.s#=s.s# and sc.c#=c.c#)
就是找出他没选过的课
写法是;select那些课,那些呢?不存在他选过的纪录的那些
也就是 not exists
(
select *
from sc
where sc.s#=s.s# and sc.c#=c.c#)
至于处理过程我也不清楚,呵呵
warren248 2003-09-10
  • 打赏
  • 举报
回复
但是能否解释一下,为什么只要这个where sc.s#=s.s# and sc.c#=c.c#就能表达出已经学习的所有课程???能否再说明一下,查询的处理过程这样可加深理解啊。谢谢了先!!!
fly_miss 2003-09-10
  • 打赏
  • 举报
回复
条件式说明当前学生((已经))学习的所有课程
fly_miss 2003-09-10
  • 打赏
  • 举报
回复
可以从双重否定等与肯定
不存在他没选过的课
就是他学习了所有的课程
tankerwang 2003-09-10
  • 打赏
  • 举报
回复
这个只是要当于两个表做自然联接

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧