关于数据库” 查询选修所有课的学生信息“ exists解法的理解
2014-03-23 00:00
302 查看
学生选课信息共三个表:
S:学生基本信息
sno sname
C:课程基本信息
cno cname
SC:选课信息
sno cno
首先得搞懂嵌套查询中相关子查询的执行过程:
首先选取父查询表中的一个元组,内部的子查询利用此元组中的相关属性值进行查询
然后父查询根据子查询返回的结果判断此行是否满足查询条件,若满足,则把该行放入父查询的查询结果中。
相当于一个循环,逐个的实验。
我们先来看看这个问题
问题一、
查询学号为‘95002’的学生选修的课程信息
select * from C where exists (select * from SC where SC.cno = C.cno and SC.sno = '95002' );
按照上述的相关子查询的执行过程:
C表中共有课程号为1,2,3,4的四门课,子查询把这四个学号对应的四个元组逐一带入,
根据子查询中的条件SC.cno = C.cno and SC.sno = '95002'
当C.cno = 1, 不存在符合条件的元组,exists返回false,父查询中不把该C.cno对应的元组放到查询结果中
当C.cno = 2,存在符合条件的元组,exists返回true,父查询中把该C.cno对应的元组放到查询结果中
当C.cno = 3 .......
当C.cno = 4 .........
逐一查询之后,就把C.cno =2 对应的元组选出来了
同理问题二、
查询学号为‘95002’未选修的课程就是
select * from C where not exists (select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno);
好了,接下来我们分析文章开始提出的问题:
select * from S where not exists
(select * from C where not exists
(select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno));
还记得我们学过的
for(i= 0 ;i < 5;i++)
for(j = 0; j < 4;j++)
某语句;
仿照上述的分析过程S表中学号分别为95001,.....,95005对应的五个元组
当Sno =95001时,这个问题就又转化为问题二了。学号为95001的学生未选修的课程是否为空,为空的的话保留。
........
遍历完学生信息表中的元组之后,也就把所有符合条件的元组选出来了。
S:学生基本信息
sno sname
95001 | 李二 |
95002 | 王三 |
95003 | 赵四 |
95004 | 孙小毛 |
95005 | 王大侃 |
cno cname
1 | 逻辑与幽默 |
2 | 电影艺术欣赏 |
3 | 大学生文化之道 |
4 | 领导魅力论 |
sno cno
95001 | 1 |
95002 | 3 |
95004 | 4 |
95005 | 2 |
95001 | 3 |
95001 | 2 |
95001 | 4 |
首先选取父查询表中的一个元组,内部的子查询利用此元组中的相关属性值进行查询
然后父查询根据子查询返回的结果判断此行是否满足查询条件,若满足,则把该行放入父查询的查询结果中。
相当于一个循环,逐个的实验。
我们先来看看这个问题
问题一、
查询学号为‘95002’的学生选修的课程信息
select * from C where exists (select * from SC where SC.cno = C.cno and SC.sno = '95002' );
按照上述的相关子查询的执行过程:
C表中共有课程号为1,2,3,4的四门课,子查询把这四个学号对应的四个元组逐一带入,
根据子查询中的条件SC.cno = C.cno and SC.sno = '95002'
当C.cno = 1, 不存在符合条件的元组,exists返回false,父查询中不把该C.cno对应的元组放到查询结果中
当C.cno = 2,存在符合条件的元组,exists返回true,父查询中把该C.cno对应的元组放到查询结果中
当C.cno = 3 .......
当C.cno = 4 .........
逐一查询之后,就把C.cno =2 对应的元组选出来了
同理问题二、
查询学号为‘95002’未选修的课程就是
select * from C where not exists (select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno);
好了,接下来我们分析文章开始提出的问题:
select * from S where not exists
(select * from C where not exists
(select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno));
还记得我们学过的
for(i= 0 ;i < 5;i++)
for(j = 0; j < 4;j++)
某语句;
仿照上述的分析过程S表中学号分别为95001,.....,95005对应的五个元组
当Sno =95001时,这个问题就又转化为问题二了。学号为95001的学生未选修的课程是否为空,为空的的话保留。
........
遍历完学生信息表中的元组之后,也就把所有符合条件的元组选出来了。
相关文章推荐
- 数据库” 查询选修所有课的学生信息“ exists解法的理解
- 使用集合操作思路,查询选修了CS305,但没有选修CS315的所有学生信息
- 查询选修所有课程的学生信息
- 编写程序,查询所有学生选修课程的期末成绩和对应等级,如学生未选修任何课程 --则输出提示信息。用case选择结果
- 数据库操作: 查询选修了所有课程的学生
- 查询数据库的所有列信息 sys.all_columns
- 例题:学习数据库查询。学生信息表的创建,主外键关系,以及45道题的查询实例。主要知识点在讲页45页,和讲页65页
- postgresql数据库查询所有字段详细信息,包括描述
- 一条SQL语句查询数据库中的所有表、存储过程、触发器 (sysobjects表信息)
- 一条SQL语句查询数据库中的所有表、存储过程、触发器 (sysobjects表信息)
- 利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息
- Mysql中查询某个数据库中所有表的字段信息
- 用外部表的方式查询当天数据库alert日志文件中当天所有的ora-错误信息
- 查询所有数据库中的所有表的所有字段的信息
- 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!
- 封装数据库查询学生信息(的增删查改)的方法
- MSSqlServer中用命令查询所有数据库、表、表中列的详细信息 【转】
- 查询数据库中所有的表的信息
- 查询关于数据库信息
- MSSqlServer中用命令查询所有数据库、表、表中列的详细信息