logo资料库

山东大学数据库2018年实验2实验报告.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
计算机学院 数据库系统 课程实验报告 实验题目:检索查询 日期:2018/10/8 班级: Email: 学号: 姓名: 实验目的: 1. 学会利用 SQL 语言进行简单的查询问题 2. 学会并掌握 SQL 的查询语句 3. 学会 SQL 的 having、group by 等 SQL 的关键查询词 实验软件和硬件环境: 软件环境: 1. Oracle 11 硬件环境: 1. 处理器 inter(R) Core(TM) i5-7300HQ CPU @2.50GHz 2. 已安装的内存(RAM): 8.00GB (7.88GB 可用) 3. 系统类型: 64 位操作系统,基于 x64 的处理器 实验原理和方法: 1. 通过书本上第三章所学习的知识进行查找问题的操作。 2. 将查找的结果创建为新的表格并提交,与标准表格比较,得出正确性。 3. 学会掌握 SQL 的单关系,多关系查询语句。 4. 学会掌握 SQL 的 group by 和 having 子句并学会使用聚集函数。 5. 学会掌握 SQL 的字符串运算,熟练运用 like 操作符来实现模式匹配。 6. 通过所学习的 SQL 知识,合理的使用,将学会的操作符巧妙的结合在一起, 以得出正确的结果。 实验步骤:(不要求罗列完整源代码) 1. 找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生) create table test2_01 as select sid,name from pub.STUDENT where SID not in(select sid from pub.STUDENT_COURSE) 2. 找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学 号、姓名 create table test2_02 as select s.sid,name from pub.STUDENT s ,pub.STUDENT_COURSE C where s.SID =C.sid and cid in (select cid from pub.STUDENT_COURSE where sid='200900130417') 3. 找出至少选修了一门其先行课程号为“300002”号课程的学生的学号、姓名
create table test2_03 as select S.SID,S.name from pub.STUDENT S,pub.STUDENT_COURSE C,pub.COURSE T where S.sid=C.sid and C.cid=T.cid and T.FCID='300002' 4. 找出选修了“操作系统”并且也选修了“数据结构”的学生的学号、姓名 create table test2_04 as select S.SID,S.name from pub.STUDENT S,pub.STUDENT_COURSE C,pub.COURSE T where S.sid=C.sid and C.cid=T.cid and T.NAME ='操作系统' intersect select S.SID,S.name from pub.STUDENT S,pub.STUDENT_COURSE C,pub.COURSE T where S.sid=C.sid and C.cid=T.cid and T.NAME ='数据结构' 5. 查询 20 岁的所有有选课的学生的学号、姓名、平均成绩(avg_score,此为 列名,下同)(平均成绩四舍五入到个位)、总成绩(sum_score) select s.sid,s.NAME,round(avg(C.SCORE),0) avg_score,sum(C.SCORE ) sum_score from pub.STUDENT s,pub.STUDENT_COURSE C where s.AGE =20 and s.SID =C.sid group by S.SID,s.NAME 6. 查询所有课的最高成绩、次高成绩(次高成绩一定小于最高成绩)、最高成绩 人数,test2_06 有四个列:课程号 cid、课程名称 name、最高成绩 max_score、 次高成绩 max_score2、最高成绩人数 max_score_count(一个学生同一门课 成绩都是第一,只计一次)。如果没有学生选课,则最高成绩为空值,最高成 绩人数为零。如果没有次高成绩,则次高成绩为空值 create table test2_06 as select cid,name,max_score,max_score2,max_score_count from (select C.cid,S.name,max(C.score) max_score from pub.STUDENT_COURSE C,pub.COURSE S where C.CID=S.cid group by C.CID ,S.NAME ) natural left outer join (select cid,max(score) max_score2 from pub.STUDENT_COURSE C where score<(select max(score) from pub.STUDENT_COURSE where C.CID=cid) group by cid)natural left outer join (select cid,count(distinct sid) max_score_count from pub.STUDENT_COURSE C where score=(select max(score) from pub.STUDENT_COURSE where C.CID=cid) group by cid) 7. 查询所有不姓张、不姓李、也不姓王的学生的学号 sid、姓名 name
create table test2_07 as select sid,name from pub.STUDENT where name not like'张%' and name not like'李%' and name not like' 王%' 8. 查询学生表中每一个姓氏及其人数(不考虑复姓),test2_08 有两个列: second_name、p_count create table test2_08 as select substr(name,1,1) second_name,count(sid) p_count from pub.STUDENT group by substr(name,1,1) 9. 查询选修了 300003 号课程的学生的 sid、name、score create table test2_09 as select S.SID,name,score from pub.STUDENT S,pub.STUDENT_COURSE C where s.sid=c.sid and c.cid ='300003' 10. 找出同一个同学同一门课程有两次或以上不及格的所有学生的学号、姓名 (即一门课程需要补考两次或以上的学生的学号、姓名) create table test2_10 as select SID , NAME from pub.STUDENT natural join pub.STUDENT_COURSE where score<60 group by sid,name,CID having count(CID)>=2 结论分析与体会: 1. 使用 SQL 语句进行查询时,某些小的逻辑错误可能会造成最终数据结果的巨 大误差。 2. 在使用 SQL 语句查询时,一定要详细了解每一个操作符的具体含义,要确保 弄清它的实现过程,例如 SQL 的字符串运算中的%,要注意%放置的位置以及 数量,否则就会造成最终结果的巨大误差。 3. 在使用 SQL 语句时,要了解自己的每一条语句所可能产生的结果,以及当与 其他语句配合时,所可能产生的连锁反应。 4. 注意灵活使用 group by 和 having 函数,以及它们后面所跟的语句内容。 5. 注意理解外连接和内链接的不同含义,不同内涵,以及它们使用时的环境, 对结果所造成的影响。 就实验过程中遇到和出现的问题,你是如何解决和处理的,自拟 1-3 道问答题: 1. 问:实验二的第六题一开始无任何思路? 答:一开始总是想通过一个表格的运算得出结果,然而发现无法得出正确的 结果,后来经过同学的指点,明白可以通过多个表格的合并,分别求不同的 表格而得出正确的结果。 2. 问:实验二的第六题为什么结果总是与标准答案相差一行数据? 答:一开始,我也无法发现为什么会缺少一行数据,后来我将构成第六题的
表格拆分为三部分,比较它们之间的相互差异,最终发现求次高成绩的表格 中缺少 cid 为 300087 的课程,于是我将这一课程的数据提取出来,发现所有 人的最高成绩都是 100,没有次高成绩,于是我对三个表格使用外连接,保 留某些表格中不存在的元组,最后得出了正确的结果。
分享到:
收藏