计算机学院 数据库系统 课程实验报告
实验题目:检索查询
日期: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,没有次高成绩,于是我对三个表格使用外连接,保
留某些表格中不存在的元组,最后得出了正确的结果。