【数据库课程】研讨02
来源:互联网 发布:oracle数据库导入表 编辑:程序博客网 时间:2024/05/16 19:03
1. 用四种方法表达查询:检索马小红老师所授课程的学期,课程号,上课时间。
所需要使用的教师表:
开课表:
要进行如题的查询,明显需要进行多表查询,涉及到的表就是上述两张。先用联结查询的方式来实现:
select O.xq,O.kh,O.sksj from O,Twhere T.xm='马小红' and T.gh=O.gh;
这是最常用的联结查询,执行时,要对表O和T做联结操作,在from子句后面写上执行联结操作的表名O和T,再在where子句中写上联结的条件T.gh=O.gh。要检索的老师姓名为马小红,所以附上T.xm=’马小红’即可完成。
第二种和第三种写法都是依靠嵌套查询实现的,第二种写法如下:
select xq,kh,sksj from Owhere gh in(select gh from T where xm='马小红');
在嵌套查询中,最常用的谓词是in,并且嵌套的子查询在外层查询处理之前求解。该查询方式为非相关子查询,子查询只需要执行一次,子查询结果不再变化,供主查询使用。所以在该查询语句中,select gh from T where xm='马小红'
被优先执行,得到需要查询人物的工号后,再次在O表中进行查询,得到结果。
第三种写法如下:
select xq,kh,sksj from O where '马小红' in(select xm from T where O.gh=T.gh);
该语句中的内层查询称为相关子查询,也就是说每查询一条记录,需要重新做一次子查询。处理过程如下:首先取外层查询中O的第一个元组(即表中每一行的数据),根据它的值和内层查询相关的属性值(即为gh)处理内层查询,若where子句返回值为真(即内层查询结果非空,也就是说内层有满足条件的元组,这里直观上看就是T中存在xm为’马小红’的元组,通过联结的方式得到其工号),则取此元组放入结果表(最后要输出的内容)中;然后接着检查外层查询中O的第二个元组,重复这一过程,知道O表全部检查完毕为止。
第四种写法,使用存在量词的嵌套查询:
select xq,kh,sksj from Owhere exists(select * from T where xm='马小红' and O.gh=T.gh );
这里的exists即为存在量词,若内层查询结果非空,则外层查询的where后面的条件为真。在本例中,对于O中的每一个元组,只要其教师为‘马小红’,则表示该元组是满足条件的元组,放入结果表中。
最后附上输出的结果:
2. 检索有学生重修的教师编号和姓名。
所需要的表 学生表S如下:
选课表E如下:
首先需要理解题目的含义,需要输出的有学生重修的教师编号和姓名,第一,学生重修怎么表示?很简单,就是同一个学生,选了不同学期的同一门课,那就表示,该学生重修了。那么输出哪一次课的教师编号和工号呢?根据题意,有学生重修,也就意味着要输出该生最后一次上这门重修课的时候的任课教师编号。那么题目就理解清楚了,代码如下:
select X.gh,T.xm from S,T,E as X,E as Y where X.gh=T.gh and S.xh=X.xh and X.xh=Y.xh and X.kh=Y.kh and Y.xq<X.xq;
这里的查询用到了三张表,分别是学生表,教师表(在题1中)和选课表。由于需要对选课表E进行重复查询,所以引入2个元组变量X和Y,在语句中应用元素变量对列名进行限定。我们来看where子句中的条件,首先是X表(也就是E表)和T的联结操作,用来输出的,没什么好解释;接着是S.xh=X.xh,这是联结操作,也不用解释
;然后是 X.xh=Y.xh
,作用是限定同一名学生,因为要重修,肯定是同一名同学所为;X.kh=Y.kh
也就是意味着选了同一门课,也就是重修;最后 Y.xq<X.xq
也就是需要选择该生最后一次上这门课的学期,用于找到这门课的任课教师。
最后的结果表也很简单:
3. 如果O表加一个个开课编号(标识码)会带来哪些影响(优缺点)?
表如下:
表中可以看出,课号和教师的工号是表的外键,加一个开课编号的含义是,添加一个唯一的编号,成为该表的主键,来指向这些在不同学期开设的不同课程。
优点: 在添加开课编号后,开课编号即为该表的主键,那么在选课表中的排序会更加容易。
选课表中的学期,课号和教师工号均可以用O中的开课编号唯一表示,可以大大节省数据的存储空间。缺点:
这样一来,选课表中学生选课的学期,课号和教师工号都被开课编号代替,那么在搜索这些信息的时候,需要关联选课表和开课表两张表,使得搜索过程变得复杂。
以上是研讨2的全部内容。
- 【数据库课程】研讨02
- 【数据库课程】研讨1
- ORACLE 数据库实践课程
- 数据库课程复习总结
- 分布式数据库课程摘要
- 《数据库引擎开发》课程
- 数据库课程笔记
- 学生-课程数据库
- 数据库课程札记
- 项目研讨
- 数据库研讨中心,关心的,想知的,分享的,写在这里我们一起学习
- 数据库系统课程大作业
- SQL_学生-课程数据库(上)
- SQL_学生-课程数据库(下)
- 大学计算机课程复习--数据库原理
- 数据库课程总结(ORACLE)
- SQL server数据库课程笔记
- 《数据库系统概论》课程指南
- bzoj 2287 消失之物
- c++ 虚函数和纯虚函数的区别
- 自然语言处理行业前沿的会议期刊
- Android Studio 引用jar及so文件
- RevitAPI之关于删除元素后
- 【数据库课程】研讨02
- C/C++ IDE
- Android MarginLeft与MarginStart的区别
- Spring Boot 启动自定义图
- 数据结构实验之排序四:寻找大富翁
- Codeup1085: 阶乘的和
- laravel中将查询的对象转换为多维数组的函数
- MySQL数据库备份和恢复方案小结
- SQLServer 每隔10分钟取一条数据