数据库系统概念实验1~实验9

本文仅为某咸鱼的实验报告记录,仅供参考,不保证一定正确,也不保证sql语句最优化。代码前斜体部分是本人对实验题目的思路,不保证方法一定最简。部分实验创建表或创建视图的语句已省略。

实验1

1.创建学生信息表(学生编号、姓名、性别、年龄、出生日期、院系名称、班级):test1_student:sid char 12 not null、name varchar 10 not null、sex char 2、age int、birthday date、dname varchar 30、class varchar 10。

create table test1_student
(
sid char(12) not null,
name varchar(10) not null,
sex char(2),
age int,
birthday date ,
dname varchar(30) ,
class varchar(10)
);

2.创建课程信息表(仅考虑一门课程最多一个先行课的情况):课程编号、课程名称、先行课编号、学分:test1_course:cid char 6 not null、name varchar 40 not null、fcid char 6、credit numeric 4,1(其中4代表总长度,1代表小数点后面长度)。

create table test1_course
(
cid char(6) not null,
name varchar(40) not null,
fcid char(6),
credit numeric(4,1)
);

3.创建学生选课信息表(学号、课程号、成绩、教师编号、选课时间)
test1_student_course:sid char 12 not null、cid char 6 not null、score numeric 5,1(其中5代表总长度,1代表小数点后面长度)、tid char 6, sctime date

create table test1_course
(
cid char(6) not null,
name varchar(40) not null,
fcid char(6),
credit numeric(4,1)
);

4.给表test1_student插入如下2行数据。
学号 姓名 性别 年龄 出生日期 院系名称 班级
200800020101 王欣 女 21 1994/2/2 计算机学院 2010
200800020102 李华 女 20 1995/3/3 软件学院 2009

insert into test1_student
values(‘200800020101’,‘王欣’,‘女’,‘21’,date‘1994-02-02’,‘计算机学院’,‘2010’);

5.给表test1_course插入如下2行数据。
课程号 课程名 先行课程号 学分
300001 数据结构 2
300002 数据库 300001 2.5

insert into test1_course
values (‘300001’,‘数据结构’,null,‘2’);
insert into test1_course
values (‘300002’,‘数据库’,‘300001’,‘2.5’);

6.给表test1_student_course插入如下2行数据。
学号 课程号 成绩 教师编号 选课时间
200800020101 300001 91.5 100101 2009-7-15 09:09:09
200800020101 300002 92.6 100102 2009-7-15 10:10:10

insert into test1_student_course
values(‘200800020101’,‘300001’,91.5,‘100101’,to_date(‘20090715090909’, ‘yyyymmddhh24miss’));
insert into test1_student_course
values(‘200800020101’,‘300002’,92.6,‘100102’,to_date(‘20090715101010’, ‘yyyymmddhh24miss’));

实验2

  1. 找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)。
    找出学号只存在于pub.student而不存在于pub.student_course的学生
Select sid, name from pub.student
Where sid not in
(select sid from pub.student_course)
  1. 找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。
    从pub.student_course找到该学生所修所有课程的cid→根据cid找出对应的sid→利用sid在pub.student中找出对应的学生→去除学号为“200900130417”的学生
Select sid, name from pub.student
Where sid !=’ 200900130417’
And sid in
(select sid from pub.student_course
Where cid in
(select cid from pub.student_course
Where sid=’ 200900130417’))
  1. 找出至少选修了一门其先行课程号为"300002"号课程的学生的学号、姓名。
    从pub.course中找出fcid=’300002’课程的cid→从pub.student_course中找出cid对应的sid→利用sid在pub.student中找出对应的学生
Select sid, name from pub.student
Where sid in
(select sid from pub.student_course
Where cid in
(select cid from pub.course
Where fcid=’300002’))
  1. 找出选修了“操作系统”并且也选修了“数据结构”的学生的学号、姓名。
    分别找出选修了“操作系统”和“数据结构”的学生(方法同第3题),使用intersect对两个结果进行交运算
(Select sid, name from pub.student
Where sid in
(select sid from pub.student_course
Where cid in
(Select cid from pub.course
Where name=’操作系统’)))
Intersect
(Select sid, name from pub.student
Where sid in
(select sid from pub.student_course
Where cid in
(Select cid from pub.course
Where name=’数据结构’)))
  1. 查询20岁的所有有选课的学生的学号、姓名、平均成绩(avg_score,此为列名,下同)(平均成绩四舍五入到个位)、总成绩(sum_score)。
    通过sid将pub.student和pub.student_course两表合并,再利用sid和name进行分组,然后使用聚集函数avg和sum计算平均值与总和
Select sid, name, round(avg(score),0)avg_score, sum(score)sum_score
From pub.student join pub.student_course using (sid)
where age=20
group by sid,name
  1. 查询所有课的最高成绩、最高成绩人数,test2_06 有四个列:课程号 cid、课程名称 name、最高成绩max_score、最高成绩人数 max_score_count(一个学生同一门课成绩都是第一,只计一次,需要考虑刷成绩情况,一个同学选了一个课程多次,两次都是最高分)。如果没有学生选课,则最高成绩为空值, 最高成绩人数为零。
    1)连接pub.course和pub.student_course两表,通过cid分组,统计每个cid下的最高分,得到由cid, name, max_score组成的表
    2)筛选pub.student_course,使之只剩下取得每门课最高分的学生的数据,通过cid分组,以sid作区分(distinct),统计每个cid下学生的人数(count),得到由cid, max_score_count组成的表
    3)连接以上两表
Select cid, name, max_score, max_score_count from
(Select cid, name, max(score)max_score
From pub.course join pub.student_course using (cid)
Group by cid, name)
join
(select psc.cid, count(distinct sid) max_score_count
From pub.student_course psc,
(select cid,max(score) max_score
from pub.student_course
group by cid ) max
where psc.cid=max.cid and psc.score=max.max_score
group by psc.cid)
using (cid)
  1. 查询所有不姓张、不姓李、也不姓王的学生的学号 sid、姓名 name。
    使用not…and…排除三种情况即可
Select sid, name from pub.student
Where name not like ‘张%’ and name not like ‘李%’ and name not like ‘王%’
  1. 查询学生表中每一个姓氏及其人数(不考虑复姓),test2_08 有两个列:second_name、p_count。
    通过substr(name,1,1)提取姓氏,然后按照姓氏对pub.student进行分组,之后使用count统计人数
Select substr(name,1,1)second_name,count(sid)p_count
From pub.student
Group by substr(name,1,1)
  1. 查询选修了 300003 号课程的学生的 sid、name、score。
    连接pub.student和pub.student_course两表进行查询即可
Select sid,name,score
From pub.student join pub.student_course using (sid)
Where cid=’300003’
  1. 找出同一个同学同一门课程有两次或以上不及格的所有学生的学号、姓名(即一门课程需要补考两次或以上的学生的学号、姓名)。
    1)筛选pub.student_course,使之只剩下score<60的数据
    2)以sid,cid为分组,统计同一个同学同一门课程下的不及格次数
    3)在上表中找出不及格次数大于1的sid
    4)在pub.student中找到对应学生
Select sid, name from pub.student
Where sid in
(select sid from
(select sid, cid, count(score)low
from
(select sid, cid, score
from pub.student_course
Where score<60)
Group by sid,cid)
Where low>1)

实验3

  1. 将 pub 用户下的 Student_31 及数据复制到主用户的表 test3_01(注意:test3_xx 要建成表不是视图,否则删除数据时会显示无此权限),删除表中的学号不全是数字的那些错误数据,学号应该是数字组成,不能够包含字母空格等非数字字符。
    使用regexp_like()函数,定义sid格式:regexp_like(sid,’[0-9]{12}’)
create table test3_01 as
select * from pub.student_31
where regexp_like(sid,'[0-9]{12}')
  1. 将 pub 用户下的 Student_31 及数据复制到主用户的表 test3_02,删除表中的出生日期和年龄(截止到2012 年的年龄,即年龄=2012-出生年份)不一致的那些错误数据。
    找出不符合要求的年龄:age!=2012-extract(year from birthday)
create table test3_02 as
select * from pub.student_31
delete from test3_02
where age!=2012-extract(year from birthday)
  1. 将 pub 用户下的 Student_31 及数据复制到主用户的表 test3_03,删除表中的性别有错误的那些错误数据(性别只能够是“男”、“女”或者空值)。
    找出非男非女非空的性别:sex!=‘男’ and sex !=‘女’ and sex not null
create table test3_03 as
select * from pub.student_31
delete from test3_03
where sex!='男' and sex !='女' and sex not null
  1. 将pub用户下的Student_31及数据复制到主用户的表test3_04,删除表中的院系名称有空格的、院系名称为空值的或者院系名称小于3个字的那些错误数据。
    院系名称有空格:dname like’% %’
    院系名称为空值:dname is null
    院系名称长度小于3:length(dname)< 3
create table test3_04 as
select * from pub.student_31
delete from test3_04
where dname is null or dname like'% %' or length(dname)< 3
  1. 将pub用户下的Student_31及数据复制到主用户的表test3_05,删除表中的班级不规范的那些错误数据,不规范是指和大多数不一致。
    不规范的班级数据:class like ‘%级%’ or class like ‘% %’
create table test3_05 as
select * from pub.student_31
delete from test3_05
where class like '%级%' or class like '% %'
  1. 将pub用户下的Student_31及数据复制到主用户的表test3_06,删除表中的错误数据,不规范的数据也被认为是那些错误数据。
    (1)学号不全是数字;
    (2)出生日期和年龄不一致的(年龄=2012-出生年份);
    (3)姓名有空格的或者长度小于2个字的;函数length()返回字符串长度。
    (4)性别有错误的(只能够是"男"、“女”、空值);
    (5)院系名称有空格的、院系名称为空值的;
    (6)院系名称小于3个字的;
    (7)班级数据有错误的(需要先找到班级里面的错误)。
    综合之前删除命令(此处使用minus)
create table test3_06 as
select * from pub.student_31
where regexp_like(sid,'[0-9]{12}')
minus
(select * from pub.student_31
where 2012-extract(year from birthday)!=age)
minus
(select * from pub.student_31
where sex!='男' and sex !='女' and sex is not null)
minus
(select * from pub.student_31
where length(name)<2 or name like'% %')
minus
(select * from pub.student_31
where dname is null or dname like'% %' or length(dname)<3)
minus
(select * from pub.student_31
where class like '%级')
  1. 将pub用户下的Student_course_32及数据复制到主用户的表test3_07,删除其中的错误数据,错误指如下情况:学号在学生信息pub.student中不存在的;
    找出学号在pub.student中不存在的学生信息:sid not in (select sid from pub.student)
create table test3_07 as
select * from pub.student_course_32
delete from test3_07
where sid not in
(select sid from pub.student)
  1. 将pub用户下的Student_course_32及数据复制到主用户的表test3_08,删除其中的错误数据,错误指如下情况:课程号和教师编号在教师授课表pub.teacher_course中不同时存在的,即没有该教师教该课程;
    找出没有错误的数据即可
create table test3_08 as
select a.* from pub.student_course_32 a,pub.teacher_course b
where a.cid =b.cid and a.tid =b.tid
  1. 将pub用户下的Student_course_32及数据复制到主用户的表test3_09,删除其中的错误数据,错误指如下情况:成绩数据有错误(需要先找到成绩里面的错误)。
    正确的成绩:score between 0 and 100
create table test3_09 as
select * from pub.student_course_32
where score between 0 and 100
  1. 将pub用户下的Student_course_32及数据复制到主用户的表test3_10,删除其中的错误数据,错误指如下情况:
    (1) 学号在学生信息pub.student中不存在的;
    (2) 课程号在课程信息pub.course中不存在的;
    (3) 教师编号在教师信息pub.teacher中不存在的;
    (4) 课程号和教师编号在教师授课表pub.teacher_course中不存在的;
    (5) 成绩数据有错误(需要先找到成绩里面的错误)。
    保留最后正确的数据。
    综合之前删除命令(此处使用minus)
create table test3_10 as
select * from pub.student_course_32
minus
(select * from pub.student_course_32
where sid not in (select sid from pub.student))
minus
(select * from pub.student_course_32
where cid not in (select cid from pub.course))
minus
(select * from pub.student_course_32
where tid not in (select tid from pub.teacher))
minus
(select * from pub.student_course_32
where  score not between 0 and 100)
minus
(select * from pub.student_course_32
where (tid,cid) not in (select tid, cid from pub.teacher_course))

实验4

  1. 将pub用户下表student_41及数据复制到主用户的表test4_01中,使用alter table语句为表增加列:“总成绩:sum_score”。
    将pub.student_course按照sid分组,求得总分,添加到test4_01中
alter table test4_01 add sum_score int;
update test4_01set sum_score=
(select sum(score)sum_score
from pub.student_course a
where a.sid=test4_01.sid
group by a.sid);
  1. 将pub用户下表student_41及数据复制到主用户的表test4_02中,使用alter table语句为表增加列"平均成绩:avg_score" (小数点后保留1位)。
    将pub.student_course按照sid分组,求得平均分,添加到test4_01中
alter table test4_02 add avg_score numeric(3,1);
update test4_02 set avg_score=
(select avg(score) from pub.student_course a
where a.sid=test4_02.sid
group by a.sid);
  1. 将pub用户下表student_41及数据复制到主用户的表test4_03中,使用alter table语句为表增加列:“总学分:sum_credit”。使用update语句,利用pub.student_course、pub.course,统计 “总学分”;
    1)利用sid,cid将pub.student_course分组,获取每名学生的各门课程成绩最大值,防止出现一名学生一门课程有多个成绩的情况
    2)将上表与pub.course自然连接(按照cid连接)
    3)筛选出sid属于test4_03且max_score>=60的数据
    4)按照sid分组计算每名学生学分之和
update test4_03 set sum_credit=
(select sum(credit)sum_credit from
(select sid,cid,max(score)max_score from pub.student_course
group by sid,cid) a
natural join pub.course
where test4_03.sid=a.sid and max_score>=60
group by sid)
  1. 将pub用户下表student_41及数据复制到主用户的表test4_04中。根据列院系名称dname到pub.department找到对应院系编号did,将对应的院系编号回填到院系名称列dname中,如果表中没有对应的院系名称,则列dname中内容不变仍然是原来的内容。
    1)限定修改内容:只修改存在于pub.department的dname
    2)将所有同时存在于test4_04和pub.department的dname修改为did
update test4_04 set dname=
(select did from pub.department d
where test4_04.dname=d.dname)
where test4_04.dname in
(select dname from pub.department)
  1. 将pub用户下表student_41及数据复制到主用户的表test4_05中,使用alter table语句为表增加4个列:“总成绩:sum_score”、 “平均成绩:avg_score”、“总学分:sum_credit”、"院系编号:did varchar(2) “。
    (1) 利用pub.student_course、pub.course,统计 “总成绩”;
    (2) 利用pub.student_course、pub.course,统计"平均成绩”,四舍五入到小数点后1位;
    (3) 利用pub.student_course、pub.course,统计 “总学分”;
    (4) 根据院系名称到pub.department或者pub.department_41中,找到对应编号,填写到院系编号中,如果都没有对应的院系,则填写为00。
    1)创建表
create table test4_05 as
select *from pub.student_41

2)添加四列,其中did列非空,默认值为’00’

alter table test4_05 add
(sum_score int,
avg_score numeric(4,1),
sum_credit int,
did varchar(2) default '00' not null)

3)利用前四题创建的表

update test4_05 set sum_score=
(select sum_score from test4_01
where test4_01.sid=test4_05.sid);
update test4_05 set avg_score=
(select avg_score from test4_02
where test4_02.sid=test4_05.sid);
update test4_05 set sum_credit=
(select sum_credit from test4_03
where test4_03.sid=test4_05.sid);
update test4_05 set did=
(select did from pub.department
where pub.department.dname=test4_05.dname)
where dname in
(select dname from pub.department);
update test4_05 set did=
(select did from pub.department_41
where pub.department_41.dname=test4_05.dname)
where dname in
(select dname from pub.department_41);
  1. 将pub用户下的Student_42及数据复制到主用户的表test4_06中,对表中的数据进行整理,修复那些不规范的数据:剔除姓名列中的所有空格;
    Translate替换:translate(name,from_str,to_str)
update test4_06 set name=translate(name,'/ ','/')
  1. 将pub用户下的Student_42及数据复制到主用户的表test4_07中,对表中的数据进行整理,修复那些不规范的数据:对性别列进行规范
update test4_07 set sex=translate(sex,'/性 ','/')
  1. 将pub用户下的Student_42及数据复制到主用户的表test4_08中,对表中的数据进行整理,修复那些不规范的数据:对班级列进行规范(需要先确定哪些班级不规范)。
update test4_08 set class=translate(class,'/级 ','/')
  1. 将pub用户下的Student_42及数据复制到主用户的表test4_09中,对表中的数据进行整理,修复那些不规范的数据:年龄为空值的根据出生日期设置学生年龄(截止到2012年的年龄,即年龄=2012-出生年份),年龄不为空值的不要改变。
    获取出生年份:extract(year from birthday)
update test4_09 set age=
2012-extract(year from birthday)
where age is null
  1. 将pub用户下的Student_42及数据复制到主用户的表test4_10中,对表中的数据进行整理,修复那些不规范的数据:
    (1) 剔除姓名列中的所有空格;
    (2) 剔除院系名称列中的所有空格;
    (3) 对性别列进行规范(需要先确定哪些性别数据不规范,也就是那些和大多数不一样的就是不规范的);
    (4) 对班级列进行规范(需要先确定哪些班级不规范)。
    (5) 年龄为空值的根据出生日期设置学生年龄(截止到2012年的年龄,即年龄=2012-出生年份),年龄不为空值的不要改变。
    update test4_10 set name=translate(name,’/ ‘,’/’)
    update test4_10 set dname=translate(dname,’/ ‘,’/’)
    update test4_10 set sex=translate(sex,’/性 ‘,’/’)
    update test4_10 set class=translate(class,’/级 ‘,’/’)
    update test4_10 set age=2012-extract(year from birthday)where age is null

实验5

  1. 在学生表pub.student中统计名字(姓名的第一位是姓氏,其余为名字,不考虑复姓)的使用的频率,将统计结果放入test5_01中,表结构如下。
    First_name varchar(4) frequency numeric(4)
    使用substr(name,2)获取名字,以之分组,统计每个名字的次数。
insert into test5_01
(first_name,frequency)
(select substr(name,2) first_name,count(*)frequency
from pub.student
group by substr(name,2) )
  1. 在学生表pub.student中统计名字(姓名的第一位是姓氏,不作统计,名字指姓名的第二个之后的汉字)的每个字使用的频率,将统计结果放入test5_02中(特别提示:需要区别union和union all的不同)。
    使用substr(name,2,1)提取姓名的第二个字,使用substr(name,3,1)提取姓名的第三个字,再使用union all将结果合并,然后进行统计。
letter varchar(2) frequency numeric(4)
insert into test5_02
(letter,frequency)
select letter,count(*) from
((select substr(name,2,1)letter
from pub.student)
union all
(select substr(name,3,1) letter
from pub.student))
where letter is not null
  1. 创建"学院班级学分达标情况统计表1"test5_03,依据pub.student, pub.course,pub.student_course统计形成表中各项数据,成绩>=60为及格计入学分,总学分>=10算作达标,院系为空值的数据不统计在下表中,表结构:院系名称dname、班级class、学分达标人数p_count1、学分未达标人数p_count2、总人数p_count。
    Dname varchar(30) class varchar(10) P_count1 Int P_count2 int P_count int
    1)创建表test5_03,所有count都默认初值为0(经考察发现,dname=‘生命科学学院’,class=‘2008’时有P_count1=0,这是本表中唯一一个零项,如果此处不设初值,后期合并数据表时会比较麻烦)
create table test5_03
(dname varchar(30),
class varchar(10),
P_count1 int default 0 not null,
P_count2 int default 0 not null,
p_count int default 0 not null)

2)从pub.student中提取sid,dname(非空),class制成test5_03_01

create table test5_03_01 as
select sid,dname,class
from pub.student
where dname is not null

3)给test5_03_01添加一列sum_credit表示这名学生的学分之和
(经考察发现,并不是所有dname非空的sid都出现在pub.student_course中,即有些同学未参加任何考试,这些学生的学分之和为0,但这些学生的sid并未出现在pub.student_course中,于是无法通过pub.student_course和pub.course获取这些同学的学分。因此此表设定每名学生学分之和初始值为0。)

alter table test5_03_01 add sum_credit int default 0 not null

4)创建表test5_03_02,连接pub.student,pub.course,pub.student_course三表,此表记录sid同时存在于pub.student和pub.student_course的每名学生每门课程成绩及格之后的最高分(也就是说某学生的某门课程最高分如果不及格,则不会出现在此表中),以及他所在的学院、年级和这门课程的学分

create table test5_03_02 as
select sid,cid,dname,class,credit,max_score from
(select sid,cid,dname,class,credit,max(score)max_score from
((select cid,credit from pub.course)
join
((select sid,dname,class from pub.student
where dname is not null)
join
(select sid,cid,score from pub.student_course)
using(sid))
using(cid))
group by sid,cid,dname,class,credit)
where max_score>=60

5)统计出现在test5_03_02中的每名学生的总学分,制成test5_03_03

create table test5_03_03 as
select sid,dname,class,sum(credit)max_credit
from test5_03_02
group by sid,dname,class

6)比较test5_03_01和test5_03_03两表,发现test5_03_03不包含所有课程都没成绩的学生,以及所有课程成绩都不及格的学生。将test5_03_03的所有学生学分之和更新到test5_03_01中,则test5_03_01已完备记录所有学院非空值的学生的学分之和(包含所有课程都没成绩的学生,所有课程成绩都不及格的学生和获得学分的学生)。

update test5_03_01 set sum_credit=
(select sum_credit from test5_03_03
where test5_03_01.sid=test5_03_03.sid)
where test5_03_01.sid in
(select sid from test5_03_03)

7)统计test5_03_01中不同学院不同年级学生人数,插入进表test5_03

insert into test5_03(dname,class,P_count)
select dname,class,count(sid)P_count
from test5_03_01
group by dname,class

8) 统计test5_03_01中不同学院不同年级学分合格人数,制成test5_03_031;
统计test5_03_01中不同学院不同年级学分不合格人数,制成test5_03_032。

create table test5_03_031 as
select dname,class,count(sid)p_count1
from test5_03_01
where sum_credit>=10
group by dname,class
create table test5_03_032 as
select dname,class,count(sid)p_count2
from test5_03_01
where sum_credit<10
group by dname,class

9)将test5_03_031和test5_03_032人数更新到test5_03

update test5_03 set p_count1=
(select p_count1 from test5_03_031
where dname=test5_03.dname and class=test5_03.class)
where (dname,class) in
(select dname,class from test5_03_031);
update test5_03 set p_count2=
(select p_count2 from test5_03_032
where dname=test5_03.dname and class=test5_03.class)
where (dname,class) in
(select dname,class from test5_03_032);

4.创建"学院班级学分达标情况统计表2"test5_04,依据pub.student, pub.course,pub.student_course统计形成表中各项数据,成绩>=60为及格计入学分,2008级及之前的班级总学分>=8算作达标,2008级之后的班级学分>=10算作达标,院系为空值的数据不统计在下表中,表结构:院系名称dname、班级class、学分达标人数p_count1、学分未达标人数p_count2、总人数p_count。
Dname varchar(30) class varchar(10) P_count1 int P_count2 int P_count int
本题可以套用第3题模式和中间表,利用test5_03_01完成。
1)创建test5_04

create table test5_04
(dname varchar(30),
class varchar(10),
P_count1 int default 0 not null,
P_count2 int default 0 not null,
p_count int default 0 not null)

2) 统计test5_03_01中不同学院不同年级学生人数,插入进表test5_04

insert into test5_04(dname,class,P_count)
select dname,class,count(sid)P_count
from test5_03_01
group by dname,class

3) 统计test5_03_01中不同学院不同年级学分合格人数,制成test5_04_01;
统计test5_03_01中不同学院不同年级学分不合格人数,制成test5_04_02。
(只需修改第3题的条件)

create table test5_04_01 as
select dname,class,count(sid)p_count1
from test5_03_01
where (sum_credit>=10 and class>2008)
or (sum_credit>=8 and class<=2008)
group by dname,class;
create table test5_04_02 as
select dname,class,count(sid)p_count2
from test5_03_01
where (sum_credit<10 and class>2008)
or (sum_credit<8 and class<=2008)
group by dname,class;

4) 将test5_04_01和test5_04_02人数更新到test5_04

update test5_04 set p_count1=
(select p_count1 from test5_04_01
where dname=test5_04.dname and class=test5_04.class)
where (dname,class) in
(select dname,class from test5_04_01);
update test5_04 set p_count2=
(select p_count2 from test5_04_02
where dname=test5_04.dname and class=test5_04.class)
where (dname,class) in
(select dname,class from test5_04_02);
  1. 查询各院系(不包括院系名称为空的)的数据结构平均成绩avg_ds_score、操作系统平均成绩avg_os_score,平均成绩四舍五入到个位,创建表test5_05,表结构及格式如下:
    Dname Avg_ds_score Avg_os_score
    分别统计两门学科平均成绩,然后连接
create table test5_05_01 as//数据结构
select dname,round(avg(max_score))avg_ds_score from
((select sid,dname from pub.student
where dname is not null)
natural join
(select sid,max(score)max_score from pub.student_course
where cid=300002
group by sid))
group by dname;
create table test5_05_02 as//操作系统
select dname,round(avg(max_score))avg_os_score from
((select sid,dname from pub.student
where dname is not null)
natural join
(select sid,max(score)max_score from pub.student_course
where cid=300005
group by sid))
group by dname;
create table test5_05 as//连接
select * from
test5_05_01 natural join test5_05_02;
  1. 查询"计算机科学与技术学院"的同时选修了数据结构、操作系统两门课的学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test5_06。
    分别找出符合条件学生的数据结构成绩和操作系统成绩,然后连接
create table test5_06_01 as//数据结构
select sid,name,dname,max(score)ds_score from
pub.student natural join pub.student_course
where dname='计算机科学与技术学院' and cid=300002
group by sid,name,dname;
create table test5_06_02 as//操作系统
select sid,name,dname,max(score)os_score from
pub.student natural join pub.student_course
where dname='计算机科学与技术学院' and cid=300005
group by sid,name,dname;
create table test5_06 as//连接
select *from
test5_06_01 natural join test5_06_02;
  1. 查询计算机科学与技术学院的选修了数据结构或者操作系统的学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test5_07
    利用外连接full outer join连接第6题中的test5_06_01和test5_06_02即可实现。
create table test5_07 as
select * from
test5_06_01 natural full outer join test5_06_02
  1. 查询计算机科学与技术学院所有学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test5_08。
    找出“计算机科学与技术学院”的所有学生,制成表test5_08_01,然后使用full outer join连接此表与第7题的表。
create table test5_08_01 as
select sid,name,dname from pub.student
where dname='计算机科学与技术学院';
create table test5_08 as
select * from
test5_07 natural full outer join test5_08_01;

实验6

  1. 找出年龄小于20岁且是"物理学院"的学生的学号、姓名、院系名称,按学号排序。
    使用order by对sid进行排序。
create view test6_01 as
select sid,name,dname from pub.student
where dname='物理学院' and age<20
order by sid
  1. 查询统计2009级、软件学院每个学生的学号、姓名、总成绩(列名sum_score)(如果有学生没有选一门课,则总成绩为空值)。
    注意使用full outer join,避免连接时遗漏未参加考试的学生。
create or replace view test6_02 as
select sid,name,sum(score)sum_score
from pub.student natural full outer join pub.student_course
where class='2009' and dname='软件学院'
group by sid,name
  1. 查询2010级、计算机科学与技术学院、操作系统的学生成绩表,内容有学号、姓名、成绩。
create or replace view test6_03 as
select sid,name,score
from pub.student natural full outer join pub.student_course
where class='2010' and dname='计算机科学与技术学院' and cid='300005'
  1. 找出选修"数据库系统"课程,且成绩大于90的学生的学号、姓名
create or replace view test6_04 as
select sid,name
from pub.student natural full outer join pub.student_course
where cid='300003' and score>90
  1. 找出姓名叫"李龙"的学生的学号及其选修全部课程的课程号、课程名和成绩。
    先连接pub.student和pub.student_course,找出‘李龙’的学号、课程号、成绩,再与pub.course连接,获取课程号对应的课程名(以下做法由于不存在哪一张表中有两个name字段,可以避免pub.student和pub.course中name字段的冲突)
create or replace view test6_05 as
select sid,cid,name,score from
(select sid,cid,score
from pub.student natural join pub.student_course
where name='李龙')
natural join pub.course
  1. 找出选修了所有课程的学生的学号、姓名
    使用not in取反:对于选修所有课程的学生,他们的sid可与任何cid组成对(sic,cid)存在于pub.student_course中;而对于其他学生的sid,必然存在某个cid,使得(sid,cid)不属于pub.student_course。于是可以用not in先找到“其他学生”,然后再用一次not in找到选修所有课程的学生。
create or replace view test6_06 as
select sid,name
from pub.student
where sid not in
(select sid from pub.student,pub.course
where (sid,cid) not in
(select sid,cid from pub.student_course))
  1. 找出选修了所有课程并且所有课程全部通过的学生的学号、姓名
    只需对第6题在从pub.student_course找(sid,cid)时添加score>=60的条件。
create or replace view test6_07 as
select sid,name
from pub.student
where sid not in
(select sid from pub.student,pub.course
where (sid,cid) not in
(select sid,cid from pub.student_course
where score>=60))
  1. 检索先行课的学分为2的课程号、课程名。
create or replace view test6_08 as
select cid,name from pub.course
where fcid in
(select cid from pub.course where credit=2)
  1. 查询统计2010级、化学与化工学院的学生总学分表,内容有学号、姓名、总学分sum_credit。
    实验5的时候做了一个关于所有学生(包括没参加任何考试的学生)sid,dname,class,sum_creadit的数据表test5_03_01,此处直接拿来使用。
create or replace view test6_09 as
select sid,name,sum_credit
from test5_03_01 natural join pub.student
where dname='化学与化工学院' and class='2010' and sum_credit>0
  1. 找出有间接先行课的所有课程的课程号、课程名称。
create or replace view test6_10 as
select cid,name
from pub.course
where fcid in
(select cid from pub.course
where fcid is not null)

实验7

  1. (1)将pub用户下表student的3个列sid,name,birthday复制到表test7_01中。
    (2)执行如下查询,观察运行速度(5秒以上)。
    查询Samefirstname相同姓氏的人数。
    select * from
    (select sid,name,birthday,
    (select count(*) from test7_01 where substr(name,1,1) = substr(t1.name,1,1)) samefirstname
    from pub.student_testindex t1)
    where samefirstname=7
    (3)为test7_01创建一个仅仅一个索引,保证上面SQL耗时在1秒内。
    (4)交卷验证

可以以substr(name,1,1)为索引进行查询
添加索引之前,查询速度约为13s;添加索引之后,查询速度约为0.14s

create index test7_01_firstname on test7_01 (substr(name,1,1))
  1. (1)将pub用户下表student的3个列sid,name,birthday复制到表test7_02中。
    (2)将出生日期全部修改成一天:
    Update test7_02 set birthday=to_date(‘19881018’,‘yyyymmdd’) where substr(sid,12,1)=‘0’;
    (3)为test7_02创建一个仅仅一个索引,保证下面SQL耗时在1秒内。
    Samenamebirthday同名同生日的人数,Samebirthday相同出生日期的人数
    select * from
    (select sid,name,birthday,
    (select count() from test7_02 where name=t1.name and birthday=t1.birthday) samenamebirthday,
    (select count(
    ) from test7_02 where birthday=t1.birthday) samebirthday
    from pub.student_testindex t1)
    where samebirthday=403
    (4)交卷验证

添加索引:(birthday,name)
用时0.14s

create index test7_02_birthday_name on test7_02 (birthday,name)
  1. (1)pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    (2)下面SQL不能用索引耗时超过2秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    查询samefirstname同姓氏的人数。
    select * from
    (select sid,name,birthday,
    (select count(*) from pub.student
    where substr(name,1,1)=substr(t1.name,1,1)) samefirstname
    from pub.student_testindex t1)
    where samefirstname=7
    (3)修改以后验证耗时在2秒之内,将修改以后语句创建成视图create view test7_03 as select ……。
    (4)交卷验证

由于对索引列进行 Like 运算时,表达式前面没有%等通配符时可以使用索引,所以为了使用索引,应当改写成name like ‘x%’的形式,而函数concat(str1,str2)可以实现两个字符串的拼接。
修改语句为:

where name like concat(substr(t1.name,1,1),'%')

用时:0.015s

  1. (1)pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    (2)下面SQL不能用索引耗时超过1秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    select * from
    (select sid,name,birthday,
    (select count() from pub.student
    where to_char(birthday,‘yyyymm’)=to_char(t1.birthday,‘yyyymm’)
    ) sameyearmonth,
    (select count(
    ) from pub.student
    where extract (year from birthday) =extract (year from t1.birthday)
    ) sameyear
    from pub.student_testindex t1) where sameyearmonth=35
    (3)修改以后验证耗时在1秒之内,将修改以后语句创建成视图create view test7_04 as select ……。
    (4)交卷验证

比较同年同月的时候,应当为birthday>=本月第一天且birthday<=本月最后一天,这里本月是指t1.birthday所在月;比较同年的时候,应当为birthday>=本年第一天且birthday<=本年最后一天,这里本月是指t1.birthday所在年。
函数trunc(date,fmt)可以用来截取日期,例如trunc (t1.birthday,‘mm’)结果即为t1.birthday所在月的第一天的00:00:00,而trunc(t1.birthday,‘yyyy’)则获得当年1月1日00:00:00。
函数last_day(date)可以获得该日期所在月的最后一天。
函数add_months(date,plusMonth)可以实现月份相加,即返回结果为日期date加上plusMonth个月之后的日期。
于是本年最后一天可以表示为last_day(add_months(trunc(t1.birthday,‘yyyy’),11))
修改语句为:

where birthday >= trunc(t1.birthday,'mm') and birthday<=last_day(t1.birthday)
where birthday >= trunc(t1.birthday,'yyyy') and birthday<=last_day(add_months(trunc(t1.birthday,'yyyy'),11))

用时:0.015s

  1. (1)pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    (2)下面SQL不能用索引耗时超过1秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    查询nextbirthday晚一天出生的人数
    select * from
    (select sid,name,birthday,
    (select count(*) from pub.student
    where birthday-1=t1.birthday
    ) nextbirthday
    from pub.student_testindex t1) where nextbirthday=7
    (3)修改以后验证耗时在1秒之内,将修改以后语句创建成视图create view test7_05 as select ……。
    (4)交卷验证

由于索引能识别等号,所以只需要将左边的-1移到右边。
修改语句为:

where birthday=t1.birthday+1

用时:0.016s

实验8

  1. 假设数据中有张老师,通过上面的操作以后,他在每次查询的时候的年龄是多少?根据你的判断得出结果,然后按步骤进行实验验证,在主用户下创建一个表test8_10(test varchar(20),age numeric (3)),插入10行数据,分表存放10个结果。
    查询结果:

实验9

  1. (1)创建表test9_01,表的结构同pub.student_11_1一样。
    (2)为test9_01的sid创建唯一不重复索引。
    (3)将pub用户下的Student中性别是“女”的数据添加到test9_01中。
    (4)将pub用户下的Student_11_1中性别是“女”的数据添加到test9_01中,如果某个学号已经包含在test9_01中,这个记录就不要再插入了(即不要插入重复学号的数据)。
    (5)将pub用户下的Student_11_2中性别是“女”的数据添加到test9_01中,如果某个学号已经包含在test9_01中,这个记录就不要再插入了(即不要插入重复学号的数据)。
    (6)要求完成上述功能,请采用1条create table、1条create index、3条insert共5条SQL方式完成。
create table test9_01 like pub.student_11_1;
create unique index test9_01_sid on test9_01 (sid);
insert into test9_01 select * from pub.student where sex='女';
insert into test9_01 select * from pub.student_11_1 where sex='女' and sid not in (select sid from test9_01);
insert into test9_01 select * from pub.student_11_2 where sex='女' and sid not in (select sid from test9_01);
  1. (1)创建表test9_02,表的结构同pub.student_11_1一样。
    (2)为test9_02的sid创建唯一不重复索引。
    (3)将pub用户下的Student中性别是“女”的且pub.student_course中存在不及格成绩的同学添加到test9_02中。
    (4)将pub用户下的Student_11_1中性别是“女”的且pub.student_course中存在不及格成绩的同学数据添加到test9_02中,如果某个学号已经包含在test9_02中,这个记录就不要再插入了(即不要插入重复学号的数据)。
    (5)将pub用户下的Student_11_2中性别是“女”的且pub.student_course中存在不及格成绩的同学数据添加到test9_02中,如果某个学号已经包含在test9_02中,这个记录就不要再插入了(即不要插入重复学号的数据)。
    (6)要求完成上述功能,请采用1条create table、1条create index、3条insert共5条SQL方式完成。
create table test9_02 like pub.student_11_1;
create unique index test9_02_sid on test9_02(sid);
insert into test9_02 select * from pub.student
where sex='女' and sid in
(select sid from pub.student_course where score < 60);
insert into test9_02 select * from pub.student_11_1
where sex='女' and sid in
(select sid from pub.student_course where score < 60)
and sid not in (select sid from test9_02);
insert into test9_02 select * from pub.student_11_2
where sex='女' and sid in
(select sid from pub.student_course where score < 60)
and sid not in (select sid from test9_02);

数据库系统概念 实验1~实验9相关推荐

  1. 计算机网络概念初探-计算机网络实验教程-实验一

    计算机网络概念初探-计算机网络实验教程-实验一 Computer Science Class1 GuoYiXuan 2021/12/25 计算机网络学习笔记系列 计算机网络实验教程-实验一:计算机网络 ...

  2. 周信东c语言实验二实验报告,周信东主编最新版C语言程序设计基础实验一实验报告.doc...

    周信东主编最新版C语言程序设计基础实验一实验报告.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我 ...

  3. c语言实验七实验报告,C语言实验七 数 实验报告.doc

    C语言实验七 数 实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法 ...

  4. 用力和应变片计算弹性模量_实验力学实验讲义(08.9).doc

    实验力学实验讲义(08.9) 实验一 电阻应变片的粘贴技术 一.实验目的 初步掌握常温电阻应变片的粘贴技术. 初步掌握应变片接线.防潮和检查等工序. 二.实验设备和器材 常温箔式电阻应变片(六片): ...

  5. java程序设计教程实验报告_java程序设计课程--实验报告-实验13.doc

    java程序设计课程--实验报告-实验13.doc 还剩 12页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...

  6. ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)

    ArcGIS实验视频教程合集:<ArcGIS实验教程从入门到精通>(附配套实验数据) [实验描述] 本系列实验教程实验二讲述了栅格数据的数字化之前必须进行的操作--地理配准(地理配配准完整 ...

  7. 苏州大学实验报告模板C语言,苏州大学实验报告-实验flash在线编程实验

    1.实验Flash在线编程实验一实验目的1进一步熟悉MT-IDE嵌入式开发系统环境.汇编.C语言.调试方式.2进一步学习SCI通信的内容.3掌握Flash存储器在线编程的基本概念.4熟悉GP32芯片F ...

  8. 谷歌A/B实验——重叠实验基础设施解读

    谷歌A/B实验--重叠实验基础设施解读 〇.来源 一.背景介绍 二.如何划分参数 三.谷歌设计的ab实验系统 3.1 域和层的设计 3.1.1 基础重叠域和层设计 3.1.2 具备非重叠和重叠的域和层 ...

  9. c语言实验题水仙花数5359,《C语言程序设计》实验报告(实验1-12).doc

    <C语言程序设计>实验报告(实验1-12).doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会 ...

最新文章

  1. get_k_data 接口文档 全新的免费行情数据接口
  2. Mysql中字段类型之时间戳大坑
  3. Acwing 第 1 场热身赛 【完结】
  4. 操作系统--系统调用
  5. Python enum的使用总结
  6. Oracle 表空间错误集锦
  7. vs2015打开EXCEL文档范例及其注意事项!!!
  8. progressbar使用方法:进度画面大小,进度画面背景,进度百分比
  9. 查询计算机系的所有教师,用sql查询所有计算机系的教师编号和姓名
  10. 同步异步和阻塞3-同步阻塞
  11. 小米路由R1D固件升级后导致Misstar tools插件页面显示错误解决方法
  12. [tomcat]-tomcat8安装apr
  13. 机器学习cs229——(一)概要
  14. 关于AP没办法获取IP地址故障排查及思路。
  15. [报错]CXF动态客户端报错:No operation was found with the name
  16. reached end of file while parsing
  17. 常规计算机 符号键是,有谁知道电脑键盘上的标示符号都代表什么意思
  18. opengl png图片 qt_Qt学习:三维绘图之OpenGL和Qt的结合(转)
  19. Weblogic错误总结
  20. 批处理脚本之批量打开常用软件

热门文章

  1. 矩阵分析之Householder Reduction
  2. ICPC2017网络赛(西安)B coin (概率计算)
  3. HTML相对路径的写法
  4. 毕设 - 大数据用户画像分析系统 - 数据分析可视化
  5. 三、路由协议——直连路由、静态路由、缺省路由、路由优先级和路由度量、路由冗余和备份(浮动静态路由)
  6. 梯度下降算法动图_一文读懂梯度下降算法
  7. 史上最简单的springcloud微服务入门实例,开箱即用,工资翻倍不是梦
  8. 新手如何学习学嵌入式开发?
  9. android之WebView应用
  10. pytorch快速入门与实战——三、Unet实现