山东大学《数据库系统》实验二:检索查询

编程入门 行业动态 更新时间:2024-10-05 17:22:05

<a href=https://www.elefans.com/category/jswz/34/1765798.html style=山东大学《数据库系统》实验二:检索查询"/>

山东大学《数据库系统》实验二:检索查询

实验题目:检索查询

实验目的:

能够掌握并熟练运用检索查询语句

实验原理和方法:

将查询语句创建成视图:如test2_01,test2 代表实验二,01 代表题目1:
Create or replace view test2_01 as select……
根据题目要求写出答案查询语句,将查询结果创建到一个视图中,点击题目 交卷验证结果是否正确。
提示:
1、任何select 确保只返回一个结果可以是另外一个select的一个输出表达式。格式如: select sid,(select… …) 列别名 from … where …
2、任何select 确保只返回一个结果可以出现在另外一个sql的条件表达式中。格式如: select … from … where xx=(select… …)。
3、任何select 可以是另外一个sql的表,即派生表。格式如: select … from student,(select…)表别名 where …。

实验步骤:

1. 找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)。自己认为查询语句正确后,通过下面语句将查询语句创建成视图test2_01

Create view test2_01 as SELECT SID,NAMEFROM pub.studentWHERE SID NOT IN     (SELECT a.SID         FROM pub.student_course a,pub.student b  WHERE a.SID=b.SID)

2. 找出至少选修了学号为"200900130417"的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。

Create view test2_02 as SELECT UNIQUE SID,NAMEFROM pub.student    WHERE SID IN     (SELECT a.SID    FROM pub.student_course a,pub.student_course b  WHERE a.CID=b.CID AND b.SID='200900130417'AND a.sid<>'200900130417')

3.找出至少选修了一门其先行课程号为"300002"号课程的学生的学号、姓名。

Create view test2_03 as SELECT UNIQUE SID,NAMEFROM pub.student    WHERE SID IN     (SELECT SID     FROM pub.student_course a,pub.course b WHERE a.CID=b.CID AND b.FCID=300002)

4.找出选修了"操作系统"并且也选修了"数据结构"的学生的学号、姓名。

Create view test2_04 as 
(select sid,name   from pub.student_course natural join pub.student   where cid in (select cid      from pub.course      where name='操作系统')
) 
intersect 
(select sid ,name   from pub.student_course natural join pub.student   where cid in (select cidfrom pub.course where name='数据结构')
)

5.查询20岁的所有有选课的学生的学号、姓名、平均成绩(avg_score,此为列名,下同)(平均成绩四舍五入到个位)、总成绩(sum_score)

Create or replace view test2_05 as 
select SID,NAME,round(avg(SCORE),0) avg_score,sum(SCORE) sum_score   from pub.student natural join pub.student_course  where age=20  group by sid,name

6.查询所有课的最高成绩、最高成绩人数,test2_06有四个列:课程号cid、课程名称name、最高成绩max_score、最高成绩人数max_score_count(一个学生同一门课成绩都是第一,只计一次)。如果没有学生选课,则最高成绩为空值,最高成绩人数为零。

Create or replace view test2_06 as
select cid,name,ms max_score,count(distinct sid) max_score_count  from pub.course natural join pub.student_course a  natural join (select cid,max(score) ms from pub.student_course group by cid)  where a.score=ms  group by cid,name,ms

7.查询所有不姓张、不姓李、也不姓王的学生的学号sid、姓名name

Create view 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 view 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 or replace view test2_09 as
SELECT sid,name,score  FROM pub.student_course natural join pub.student  WHERE cid=300003

10.找出同一个同学同一门课程有两次或以上不及格的所有学生的学号、姓名(即一门课程需要补考两次或以上的学生的学号、姓名)。

Create or replace view test2_10 as
select sid,name from (select sid,count(score) cs    from pub.student_course        where score < 60        group by sid ,cid) natural join pub.studentwhere cs>1

结论分析与体会:

利用折行和缩进会使sql语句结构更加清晰明了,完成实验之前需要仔细阅读题目的要求(如,查询2:不包含这名同学),并且在查询过程中一定要考虑特殊情况,阅读提示(如,查询6:存在一个学生同一门课成绩都是第一,只计一次)。

就实验过程中遇到和出现的问题,你是如何解决和处理的,自拟1-3道问答题:

Q1:查询5:如何平均成绩四舍五入到个位?
A1:上网查询,利用ROUND(number[,decimals])
其中:number 待做截取处理的数值,decimals 指明需保留小数点后面的位数。可选项,忽略则截去所有的小数部分,并四舍五入。

Q2:查询6:提交结果验证返回一行数据错误,如何修正?
A2:存在最高分者再次选修刷到同分的情况,导致最高成绩人数多一人。在实际操作中也要考虑到类似的特殊情况。

Q3:查询8 :如何查询学生表中每一个姓氏?
A3:查询oracle中截取字符的方法,即substr(string, start_position, [ length ])

更多推荐

山东大学《数据库系统》实验二:检索查询

本文发布于:2024-03-23 17:31:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1740896.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:山东大学   数据库系统

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!