山东大学 2020级数据库系统 实验四

What’s more

山东大学 2020级数据库系统 实验一
山东大学 2020级数据库系统 实验二
山东大学 2020级数据库系统 实验三
山东大学 2020级数据库系统 实验四
山东大学 2020级数据库系统 实验五
山东大学 2020级数据库系统 实验六
山东大学 2020级数据库系统 实验七
山东大学 2020级数据库系统 实验八、九

写在前面

做数据库实验一定要静得下心来,才能发现其中的错误然后进行改正。同时,如果发现 SQL 语句总是报错,“一定是你错了,只是不知道错在哪里!”

其次,SQL 语句中较为复杂的点博主都进行了注释,希望大家一定要看懂思路后自己写一遍,而不是盲目的 Ctrl+C,Ctrl+V,切记切记!!

实验四

实验四主要考察的内容如下:
对于 alter 语句的掌握程度以及是否能够使用它来对表中的属性进行操作;

对于 update … set … where 子句的使用;

对字符串的处理以及删除字符串中相应的字符;

  • 4-1 将 pub 用户下表 student_41 及数据复制到主用户的表 test4_01 中,使用 alter table 语句为表增加列: “总成绩:sum_score”。
    使用 update 语句,利用 pub.student_course,统计 “总成绩”;

    思路:
    1. 先指用 alter table test4_01 add sum_score int 来添加对应的属性列。需要注意的是 add 子句后面的属性列还有跟上该列的类型说明;
    2. 使用 update … set … 结构计算每个学生的总成绩然后填入 sum_score 列中即可;
alter table test4_01add sum_score int
update test4_01 S
set sum_score =(select sum(score)from pub.student_course Twhere S.sid = T.sidgroup by sid)
  • 4-2 将 pub 用户下表 student_41 及数据复制到主用户的表 test4_02 中,使用 alter table 语句为表增加列 “平均成绩:avg_score” (小数点后保留 1 位)。
    利用 pub.student_course,统计“平均成绩”,四舍五入到小数点后 1 位

    思路:

    1. 思路其实和 4-1 相似,添加对应列,然后分别进行平均成绩的计算即可;
    2. 保留小数点后 1 位使用 round() 函数即可;

    需要注意的是:在对 avg_score 属性列进行定义的时候,由于保留一位小数,因此需要使用 numeric(3, 1) 来设置哦~~

alter table test4_02add avg_score numeric(3, 1)
update test4_02 S
set avg_score = (select round(avg(score), 1)from pub.student_course Twhere S.sid = T.sidgroup by sid)
  • 4-3 将 pub 用户下表 student_41 及数据复制到主用户的表 test4_03 中,使用 alter table 语句为表增加列: “总学分:sum_credit”。
    使用 update 语句,利用 pub.student_course、pub.course,统计 “总学分”;
    这时需要注意:成绩及格才能够计算所得学分,一门课多个成绩都及格只计一次学分。

    思路:
    1. 使用 alter … add … 来添加对应的属性列,同时注意列属性的定义为 int 即可;
    2. 注意题目中的提示“一门课多个成绩都及格只计一次学分”,因此我们不能简单地使用 score > 60 然后 sum(credit) ;正确的方法应该是得到每个学生每门课的最高成绩,用这个最高成绩来判断是否 > 60,若大于 60 ,则计一次学分;由于每个学生的最高分是唯一的,因此我们在 sum(credit) 时相当于只计算了一次,而不是像前者一样计算多次。
alter table test4_03add 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_coursegroup by sid, cid) t1where t0.sid = sidand t1.max_score >= 60				-- 利用最高分来进行判断group by sid)
  • 4-4 将 pub 用户下表 student_41 及数据复制到主用户的表 test4_04 中。 根据列院系名称 dname 到 pub.department 找到对应院系编号 did,将对应的院系编号回填到院系名称列 dname 中,如果表中没有对应的院系名称,则列 dname 中内容不变仍然是原来的内容。
    思路:
    1. 首先使用 create table … as select * … 来将 pub.student_41 中的所有数据 copy 到 test4_04 中;
    2. 然后使用 dname 去判断这个 dname 是否在 pub.department 中;
    3. 若是,则将 dname 更新为相应的 did;反之则不更新;
create table test4_04 as
select *
from pub.student_41
update test4_04 t0
set dname =(select didfrom pub.departmentwhere dname = t0.dname)
where t0.dname in(select dnamefrom pub.department)
  • 4-5 将 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。
    说明:执行 update 后,在查询表中数据,可能出现顺序变化,这是正常,因为数据在表中是无序。需要 顺序的时候可以通过 orderby 实现。

    思路:
    1. 首先使用 create 语句进行表和数据的复制;
    2. 然后使用 alter table 语句在复制得到的表中添加对应列;注意 alter 似乎不能一起添加,因此需要一列一列地进行属性列地添加;
    3. 最后使用 update … set … 子句来对表中的属性列进行更新即可(set 可以同时更新多列哦~~)

需要注意的是:对于院系编号地更新时,现在是从两个表中寻找对应的院系编号而不是一个表了(当时卡了好久/(ㄒoㄒ)/~~),这两个表可以通过 union 来连接。(由于是前面问题的综合,因此代码较长)

create table test4_05 as
select *
from pub.student_41
alter test4_05add sum_score int
-----------------分开哦-----------------------
alter test4_05add avg_score numeric(3, 1)
-----------------分开哦-----------------------
alter test4_05add sum_credit int
-----------------分开哦-----------------------
alter test4_05add did varchar(2)
update test4_05 t0
set
sum_score = (select sum(score)from pub.student_course t1where t0.sid = t1.sidgroup by sid), 
avg_score =(select round(avg(score), 1)from pub.student_course t2where t0.sid = t2.sidgroup by sid),
sum_credit = (select sum(credit)from pub.course natural join (select sid, cid, max(score) max_scorefrom pub.student_coursegroup by sid, cid) t1where t0.sid = sidand t1.max_score >= 60group by sid),
did = 
casewhen dname in(	(select dnamefrom pub.department)union(select dnamefrom pub.department_41)	)then(select didfrom (	(select dname, didfrom pub.department)union(select dname, didfrom pub.department_41)	)where dname = t0.dname)
else '00'
end
  • 4-6 将 pub 用户下的 Student_42 及数据复制到主用户的表 test4_06 中,对表中的数据进行整理,修复那些不规范的数据: 剔除姓名列中的所有空格;
    思路:
    1. 使用 create 来将表和数据进行复制;

    2. 为了删除空格,我们可以使用函数 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, ' ', '')
  • 4-7 将 pub 用户下的 Student_42 及数据复制到主用户的表 test4_07 中,对表中的数据进行整理,修复那些不规范的数据: 对性别列进行规范(需要先确定哪些性别数据不规范,也就是那些和大多数不一样的就是不规范的);
    思路:
    1. 使用 create 子句来对表和表中的数据进行复制;
    2. 为了看到哪些才是不规范的数据,我们可以首先使用:
      select distinct sex, count(sex) from test4_07 group by sex
      来查看所谓的“不规范数据”。发现:不规范的数据是加上了“性”字的 sex 值,同时有些 sex 值的前后可能还有空格等;
    3. 具体的删除方法我们还是可以使用 replace() 函数;
create table test4_07 as
select *
from pub.student_42
update test4_07
set sex = 
casewhen sex like '%男%' then '男'		-- %表示省略一个或多个字符when sex like '%女%' then '女'else sex
End
  • 4-8 将 pub 用户下的 Student_42 及数据复制到主用户的表 test4_08 中,对表中的数据进行整理,修复那些不规范的数据: 对班级列进行规范(需要先确定哪些班级不规范)。
    思路:
    1. 首先使用 create 来对表以及表中的数据进行复制;
    2. 然后使用
      select distinct class, count(class) from test4_08 group by class
      来看看哪些班级数据是不规范的数据。发现,不规范的班级数据后面又“级”字,我们只需要使用 replace() 函数来将它去掉即可;
create table test4_08 as
select *
from pub.student_42
update test4_08
set class = replace(class, '级', '')
  • 4-9 将 pub 用户下的 Student_42 及数据复制到主用户的表 test4_09 中,对表中的数据进行整理,修复那些不规范的数据: 年龄为空值的根据出生日期设置学生年龄(截止到 2012 年的年龄,即年龄=2012-出生年份),年龄不 为空值的不要改变。
    思路:
    1. 首先使用 create 来对表以及表中的数据进行复制;
    2. 然后使用 update 和 where 判定语句来对 age 列进行更新即可;
    3. 期间还是用到了实验三中提到的 extract() 函数哦~~
create table test4_09 as
select *
from pub.student_42
update test4_09
set age = 2012 - extract(year from birthday)
where age is null
  • 4-10 将 pub 用户下的 Student_42 及数据复制到主用户的表 test4_10 中,对表中的数据进行整理,修复那些不规范的数据:
    (1) 剔除姓名列中的所有空格;
    (2) 剔除院系名称列中的所有空格;
    (3) 对性别列进行规范(需要先确定哪些性别数据不规范,也就是那些和大多数不一样的就是不规范的);
    (4) 对班级列进行规范(需要先确定哪些班级不规范)。
    (5) 年龄为空值的根据出生日期设置学生年龄(截止到 2012 年的年龄,即年龄=2012-出生年份), 年龄不为空值的不要改变。

    思路:
    1. 就是对前面所有的问题的综合,由于 set 中可以同时设置多个列,因此将它们连接起来即可;
create table test4_10 as
select *
from pub.student_42
update test4_10
set name = replace(name, ' ', ''),
dname = replace(dname, ' ', ''), 
sex = 
casewhen 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

再次强调:一定是看懂思路之后自己实践哈~~
有问题还请斧正!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jupyter(Anaconda)打不开浏览器

问题描述 有时jupyter不能自动打开浏览器,jupyter notebook输入回车后,不能跳转,把输出的链接复制粘贴到浏览器后,写的代码页不能运行。 问题解决 不是软件什么的问题,而是他们的用户名为中文的问题。只要把用户名改为…

C语言数组初入

情景 实用程序输出一个 44 的整数矩阵&#xff0c;代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> int main() {int a120, a2345, a3700, a422;int b156720, b299, b322, b42;int c1233, c2205, c31, c46666;int d134, d20, d323, d423006783;pri…

最全python爬虫库安装详解

目录 一、请求库的安装 1.requests 的安装 2.Selenium的安装 3.ChromeDrive 的安装 4.GeckoDriver 的安装 5.PhantomJS 的安装 6.aiohttp 的安装 二、解析库的安装 1.lxml 的安装 2.Beautiful Soup 的安装 3.pyquery 的安装 4.tesserocr 的安装 一、请求库的安装 …

山东大学 2020级数据库系统 实验五

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

C语言二维数组的使用

二维数组的定义 二维数组定义的一般形式是&#xff1a; dataType arrayName[length1][length2];其中&#xff0c;dataType 为数据类型&#xff0c;arrayName 为数组名&#xff0c;length1 为第一维下标的长度&#xff0c;length2 为第二维下标的长度。 我们可以将二维数组看…

python基础入门(8)之集合

目录 Python集合 一、集合理解 二、访问集合 2.1&#xff09;遍历集合 3.2&#xff09;检查是否存在 三、添加集合 3.1&#xff09;添加项目值 3.3&#xff09;添加任何可迭代对象 四、移除集合项 4.1&#xff09;remove方法 4.2&#xff09;iscard() 方法 4.3&…

山东大学 2020级数据库系统 实验六

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

C语言数组元素的查询

数组的查询 在日常的开发过程中&#xff0c;我们经常需要查询数组中的元素&#xff0c;这就需要我们使用数组元素查询的方法来进行查询。 对无序数组的查询 无序数组&#xff0c;就是数组元素的排列没有规律。无序数组元素查询的思路也很简单&#xff0c;就是用循环遍历数组…

山东大学 2020级数据库系统 实验七

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

python基础入门(9)之字典

目录 Python字典 一、字典理解 1.1&#xff09;创建字典与访问 1.2&#xff09;字典长度 1.3&#xff09;数据类型 二、访问字典 2.1&#xff09;访问键名 2.2&#xff09;访问健值 三、更改字典各种方法 四、添加字典项各种方法 五、删除字典的各种方法 ​六、遍历…

山东大学 2020级数据库系统 实验八、九

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

python基础入门(10)之循环语句

目录 一、If … Else语句 一.if语句 二.缩进 三.elif语句 四.else语句 4.1基本else 4.2&#xff09;and语句 4.3&#xff09;or 语句 4.4&#xff09;嵌套if语句 4.4&#xff09;pass语句 二、while循环语句 一.基本理解 二.中断声明 三.continue 声明 四.else …

python基础(11)之函数

目录 函数 一、创建函数与调用 二、参数 三、参数数量 四、任意参数&#xff0c;*args 五、关键字参数 七、任意关键字参数&#xff0c;**kwargs 八、默认参数值 九、将列表作为参数传递 十、返回值 十一、pass语句 函数 一、创建函数与调用 在 Python 中&#xf…

排序算法的实现及时间复杂度分析——计数排序、选择排序、冒泡排序、插入排序

文章目录排序算法计数排序选择排序冒泡排序插入排序排序算法 排序算法是解决问题中常见且非常重要的一环&#xff0c;针对相应的问题选择相应的排序算法&#xff0c;能够提高问题解决速度&#xff0c;节省时间&#xff01;&#xff01;&#xff01; 常见的排序算法有&#xf…

python基础(12)之匿名函数lambda

lambda lambda 函数是一个小的匿名函数。一个 lambda 函数可以接受任意数量的参数&#xff0c;但只能有一个表达式。 语法&#xff1a; lambda arguments : expression 执行表达式并返回结果&#xff1a; 示例将 10 添加到 argument a&#xff0c;并返回结果&#xff1a; …

C语言快速排序

快速排序是对冒泡法排序的一种改进。 快速排序算法 的基本思想是&#xff1a;将所要进行排序的数分为左右两个部分&#xff0c;其中一部分的所有数据都比另外一 部分的数据小&#xff0c;然后将所分得的两部分数据进行同样的划分&#xff0c;重复执行以上的划分操作&#xff0…

机器学习入门(1)之基本概念简介

目录 一、机器学习概述 1.1 什么是机器学习&#xff1f; 1.2 为什么需要机器学习&#xff1f; 1.3 机器学习应用场景 1.4 机器学习的一般流程 1.5 典型的机器学习过程​ 二、机器学习的基本术语 三.假设空间与版本空间 四、归纳偏好 1.哪种更好 2..假设的选择原则 …

山东大学 2020级计算机系统原理——拆解二进制炸弹

写在前面 第一次拿到这个实验还是有点慌&#xff01;之前没见过&#xff0c;不过还是慢慢做过来了。 这是个需要耐心的过程&#xff0c;请一定静下心来哦&#xff01; 环境及配置 环境&#xff1a;Ubuntu 20.04 GDB 调试工具 可参考配置&#xff1a;GDB调试工具配置&#…

机器学习入门(2)之模型评估与选择

目录 一、误差与拟合 1. 泛化误差与经验误差 2. 损失函数与训练误差 3. 过拟合与欠拟合 4. 过拟合的另一种现象&#xff1a;数据泄露 二、评估方法 1. 留出法 2. 交叉验证法&#xff08;留一法&#xff09; 3. 自助法 4. 调参与最终模型 三、性能度量 1. 混淆矩阵 …

pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练

文章目录1. MNIST 手写数字识别2. 聚焦数据集扩充后的模型训练3. pytorch 手写数字识别基本实现3.1完整代码及 MNIST 测试集测试结果3.1.1代码3.1.2 MNIST 测试集测试结果3.2 使用自己的图片进行测试3.2.1 测试图片预处理代码3.2.2 测试图片结果4. 数据增强4.1 手动读取 MNIST …