山东大学 2020级数据库系统 实验一
山东大学 2020级数据库系统 实验二
山东大学 2020级数据库系统 实验三
山东大学 2020级数据库系统 实验四
山东大学 2020级数据库系统 实验五
山东大学 2020级数据库系统 实验六
山东大学 2020级数据库系统 实验七
山东大学 2020级数据库系统 实验八、九
做数据库实验一定要静得下心来,才能发现其中的错误然后进行改正。同时,如果发现 SQL 语句总是报错,“一定是你错了,只是不知道错在哪里!”
其次,SQL 语句中较为复杂的点博主都进行了注释,希望大家一定要看懂思路后自己写一遍,而不是盲目的 Ctrl+C,Ctrl+V,切记切记!!
实验四主要考察的内容如下:
对于 alter 语句的掌握程度以及是否能够使用它来对表中的属性进行操作;
对于 update … set … where 子句的使用;
对字符串的处理以及删除字符串中相应的字符;
alter table test4_01 add sum_score int
update test4_01 S set sum_score = (select sum(score) from pub.student_course T where S.sid = T.sid group by sid)
4-2 将 pub 用户下表 student_41 及数据复制到主用户的表 test4_02 中,使用 alter table 语句为表增加列 “平均成绩:avg_score” (小数点后保留 1 位)。
利用 pub.student_course,统计“平均成绩”,四舍五入到小数点后 1 位
思路:
需要注意的是:在对 avg_score 属性列进行定义的时候,由于保留一位小数,因此需要使用 numeric(3, 1) 来设置哦~~
alter table test4_02 add avg_score numeric(3, 1)
update test4_02 S set avg_score = (select round(avg(score), 1) from pub.student_course T where S.sid = T.sid group by sid)
alter table test4_03 add sum_credit int
update test4_03 t0 set sum_credit = (select sum(credit) from pub.course natural join (select sid, cid, max(score) max_score -- 得到每个学生每门课的最高分 from pub.student_course group by sid, cid) t1 where t0.sid = sid and t1.max_score >= 60 -- 利用最高分来进行判断 group by sid)
create table test4_04 as select * from pub.student_41
update test4_04 t0 set dname = (select did from pub.department where dname = t0.dname) where t0.dname in (select dname from pub.department)
需要注意的是:对于院系编号地更新时,现在是从两个表中寻找对应的院系编号而不是一个表了(当时卡了好久/(ㄒoㄒ)/~~),这两个表可以通过 union 来连接。(由于是前面问题的综合,因此代码较长)
create table test4_05 as select * from pub.student_41
alter test4_05 add sum_score int -----------------分开哦----------------------- alter test4_05 add avg_score numeric(3, 1) -----------------分开哦----------------------- alter test4_05 add sum_credit int -----------------分开哦----------------------- alter test4_05 add did varchar(2)
update test4_05 t0 set sum_score = (select sum(score) from pub.student_course t1 where t0.sid = t1.sid group by sid), avg_score = (select round(avg(score), 1) from pub.student_course t2 where t0.sid = t2.sid group by sid), sum_credit = (select sum(credit) from pub.course natural join (select sid, cid, max(score) max_score from pub.student_course group by sid, cid) t1 where t0.sid = sid and t1.max_score >= 60 group by sid), did = case when dname in ( (select dname from pub.department) union (select dname from pub.department_41) ) then (select did from ( (select dname, did from pub.department) union (select dname, did from pub.department_41) ) where dname = t0.dname) else '00' end
使用 create 来将表和数据进行复制;
为了删除空格,我们可以使用函数 replace(string, target_str, replace_str) 来进行;
第一个参数 string 表示需要修改的字符串;第二个参数 target_str 表示在该字符串中需要修改的字符(为了查找到该字符);第三个参数 replace_str 表示需要将 target_str 替换为什么字符;
在本题中,我们可以这样使用 replace 函数:replace(name, ’ ', ‘’),找到空格并将它删去;(translate()函数也有类似的功能!)
create table test4_06 as select * from pub.student_42
update test4_06 set name = replace(name, ' ', '')
select distinct sex, count(sex) from test4_07 group by sex
create table test4_07 as select * from pub.student_42
update test4_07 set sex = case when sex like '%男%' then '男' -- %表示省略一个或多个字符 when sex like '%女%' then '女' else sex End
select distinct class, count(class) from test4_08 group by class
create table test4_08 as select * from pub.student_42
update test4_08 set class = replace(class, '级', '')
create table test4_09 as select * from pub.student_42
update test4_09 set age = 2012 - extract(year from birthday) where age is null
create table test4_10 as select * from pub.student_42
update test4_10 set name = replace(name, ' ', ''), dname = replace(dname, ' ', ''), sex = case when sex like '%男%' then '男' when sex like '%女%' then '女' else sex end, class = replace(class, '级%', ''), age = case when age is null then 2012 - extract(year from birthday) else age end
再次强调:一定是看懂思路之后自己实践哈~~
有问题还请斧正!