注意下:如果你不是电管专业的,那么你可能需要的并不是这个文档。这个文档是电管选修课“数据库技术与应用”的资料整理。其他专业的数据库似乎是英方课。
上面是习题,往下翻是实验报告。
习题及答案整理
一
简述数据库管理系统的主要功能
二
三
四
五
六
七
八
九
十
十一
背景习题 3.3.1 在上一题
十二
十三(上机实验三)
实验报告一 & 二
本机主机名与 IP 地址(作业要求)
指令 ipconfig -all
会查询到本机所有的网络状态。
本机的校园网连接信息为:
实验 1-1 在本机(WIndows)安装 MySQL Community 8.3
下载与安装
下载 MySQL Community Server 8.3 版本的 msi 安装包
我选择 Custom 安装模式,修改安装位置将 MySQL 安装到 F 盘下。
安装完成后允许打开 Configurator,把数据目录也配置到 F 盘下。
配置本机为开发用设备,设置端口号 3306,
配置用户。除了根用户外我额外配置了一个以我学号和姓名命名的 DB Admin 角色。
其他设置(服务等)保持默认。Configurator 自动开始初始化。
安装完成。
检查安装是否成功
通过命令行,以我的姓名学号用户身份连接该 MySQL 数据库: (上面那条报错是 PowerShell 不允许把当前目录下的 exe 以指令形式执行,忘了这茬事了)
连接正常,安装成功。
实验 1-2 在本机(Windows)安装 PostgreSQL
作业要求:
作业 1:上机安装一个 DBMS,建议使用 mySQL 或华为 openGauss
根据华为官网消息,OpenGauss 数据库内核为 PostgreSQL,而后者使用 BSD 开源,且社区相对更完善。本次实验选择安装 PostgreSQL 作为实验内容。
下载与安装
下载 Postgres for Windows 安装包。
把安装目录切到 F 盘
确认安装所有组件(之前我装过一次,PgAdmin 之类的还留在本机上)
数据目录也放 F 盘
为根用户设置密码,设置服务端口为 5432。
不配置本地化,直接一路默认 Next。开始安装。
安装完毕。
检查安装是否成功
pg 提供了一个 SQL Shell 供我们测试。
安装成功。
实验 1-3 在 Linux 云服务器(CentOS 7)上通过 Docker 部署运行 MariaDB
有一台 2h2g 的轻量云服务器,公网 IP 为 (censored)。实验在该机器上安装 MariaDB。 MariaDB 作为 MySQL 的一个分支,旨在规避 MySQL 被 Oracle 闭源的风险,保持了开源和社区驱动的特性,具有性能强大、稳定可靠的优点,支持更多存储引擎并拥有活跃的社区支持。而 Docker 作为轻量级的容器技术,可以将应用程序及其依赖项打包到一个可移植的容器中,实现快速部署、跨平台运行、隔离性和快速启动停止,适用于微服务架构和持续集成部署。是现代运维比较常用的一个方案。 查询可用的 Docker 镜像:
拉取 Docker Hub 社区镜像。
起容器。映射到 3306 上。
放开一下 3306 端口
检查下容器运行情况
容器运行正常,安装完毕。
检查是否安装成功
用 Navicat 点一下
连接没有问题。
检查一下 默认表存在。
安装成功。
(安全起见,这个容器在确认安装正常后就已经销毁了)
实验报告二
实验二要求将习题 2.4.1 中的数据存储到数据库中。该习题的数据如下。
实验一中安装了三种数据库,但是因为都是关系型数据库,所以操作上大体没有差别。本次实验使用 MySQL 操作。
实验 2-1 通过命令行 SQL 语句操作数据库
添加包含自己学号和姓名的表
系作业要求。编写 SQL 语句建表:
|
|
插入我的学号和姓名:
|
|
建库建表,数据定义
首先建库建表。编写 SQL 语句如下: (题目中未指定主键,不创建 pk)
|
|
执行建库建表:
插入数据
编写 SQL 语句用于插入数据。题目里的数据太多,对每个表都先插入前 15 条。
|
|
|
|
|
|
|
|
实验 2-2 使用 Navicat 查看数据库
连接到数据库:
查看数据库中的表:
可以看到数据已经成功插入。
实验报告三
实验设计背景
北邮人论坛是北京邮电大学的校园论坛,成立于 2003 年 9 月 26 日 ,由 seasir 和 chit 担任创始站长 ,并由北邮人团队负责维护和运营,是北邮学生、校友和教职工交流信息、分享经验、讨论问题的核心平台。现已经成为北邮校内最大的信息交流平台 ,在北邮及周边学校中拥有较为固定的使用人群,在高校论坛里十分火爆,人气颇高。论坛不仅是一个信息交流的平台,也是北邮人社交和文化生活的重要组成部分。
实验仿照北邮人论坛,设计一个简易版本的论坛雏形,用于完成基本的论坛职能。
数据关系设计
从整体上来看,此业务可大致拆分为如下交互实体:
- 用户,有如下属性:是否为管理员,真实姓名,论坛昵称,学号,用户名,密码,发过什么帖子,发过什么回复,注册时间。
- 版块,有如下属性:版块名称,版块简介,版块管理员,版块下有帖子,一个帖子只能在一个版块下。一个版块可以有多个管理员,一个管理员也可以是多个版块的管理。
- 帖子,有如下属性:帖子标题,帖子正文,楼主,帖子有什么回复。
- 回复,有如下属性:回复发送者,回复的是什么帖子,回复内容。
当然北邮人论坛还有很多功能如点赞、首页推荐等,本次实验设计不涉及,只做一个最简化版本的实现。我们结合实际业务需求,可以设计出如下表关系:
用户(Users)
- 属性:
UserID
:用户唯一标识符,主键,自增。IsAdmin
:布尔值,表示用户是否为管理员。RealName
:用户的真实姓名。Nickname
:用户在论坛上的昵称。StudentNumber
:用户的学号,唯一。Username
:用户的用户名,唯一。Password
:用户的密码。RegisterTime
:用户的注册时间。
- 关系:
- 一个用户可以发多个帖子(Posts 表中
AuthorID
外键)。 - 一个用户可以发多个回复(Replies 表中
AuthorID
外键)。
- 一个用户可以发多个帖子(Posts 表中
版块(Forums)
- 属性:
ForumID
:版块唯一标识符,主键,自增。ForumName
:版块名称。ForumDescription
:版块简介。ForumAdminID
:版块的管理员(可以在ForumAdmins
表中定义多个管理员)。
- 关系:
- 一个版块可以包含多个帖子(Posts 表中
ForumID
外键)。 - 一个版块可以由多个管理员管理(通过
ForumAdmins
表实现多对多关系)。
- 一个版块可以包含多个帖子(Posts 表中
版块管理员(ForumAdmins)
- 属性:
ForumAdminID
:版块管理员关系的唯一标识符,主键,自增。UserID
:用户唯一标识符,外键,引用Users
表中的UserID
。ForumID
:版块唯一标识符,外键,引用Forums
表中的ForumID
。
- 关系:
- 一个管理员可以管理多个版块。
- 一个版块可以有多个管理员。
帖子(Posts)
- 属性:
PostID
:帖子唯一标识符,主键,自增。Title
:帖子标题。Content
:帖子正文。AuthorID
:发帖人,外键,引用Users
表中的UserID
。ForumID
:所属版块,外键,引用Forums
表中的ForumID
。PostTime
:发帖时间。
- 关系:
- 一个帖子只能在一个版块下(通过
ForumID
外键)。 - 一个帖子可以有多个回复(Replies 表中
PostID
外键)。
- 一个帖子只能在一个版块下(通过
回复(Replies)
- 属性:
ReplyID
:回复唯一标识符,主键,自增。Content
:回复内容。AuthorID
:回复发送者,外键,引用Users
表中的UserID
。PostID
:回复的帖子,外键,引用Posts
表中的PostID
。ReplyTime
:回复时间。
- 关系:
- 一个回复只能对应一个帖子(通过
PostID
外键)。 - 一个回复由一个用户发送(通过
AuthorID
外键)。
- 一个回复只能对应一个帖子(通过
补充说明
- 每个用户都有唯一的
UserID
,StudentNumber
,和Username
。 - 每个版块都有唯一的
ForumID
。 - 每个帖子都有唯一的
PostID
。 - 每个回复都有唯一的
ReplyID
。 - 每个版块可以有多个管理员,通过中间表
ForumAdmins
实现。 - 每个管理员可以管理多个版块,同样通过
ForumAdmins
表实现。
ER 图
此业务的 ER 图描述如下:
建表 SQL 语句
我们结合数据设计和各字段属性的域、存储长度等,可写出如下 SQL 建表语句:
建表设计
用户表(Users)
此表存储论坛用户的信息。
|
|
版块表(Forums)
此表存储论坛的版块信息。
|
|
版块管理员表(ForumAdmins)
此表存储版块的管理员信息,一个版块可以有多个管理员,一个管理员也可以管理多个版块。
|
|
帖子表(Posts)
此表存储论坛的帖子信息。
|
|
回复表(Replies)
此表存储对帖子回复的信息。
|
|
实践建库 & 建表
创建一个叫数据库课设论坛的数据库,用来做这次上机作业。
开始建表
建表完成。
用 Navicat 可视化看一下表结构:
建表成功,实验完成。
实验报告四
准备实验环境(建库建表,录入数据)
实验一没把数据录完,这里重新录入。
实验使用的数据来自习题 2.4.1。其数据模式如下:
Product(maker,model,type)
PC(model,speed,ram,hd,price)
Laptop(model,speed,ram,hd,screen,price)
Printer(model,color,type,price)
将题目数值录入电子化表格如下: (电子表格忽略了浮点数值的小数点后的尾部 0,通过 SQL 录入时不受此处影响)
maker | model | type |
---|---|---|
A | 1001 | pc |
A | 1002 | pc |
A | 1003 | pc |
A | 2004 | laptop |
A | 2005 | laptop |
A | 2006 | laptop |
B | 1004 | pc |
B | 1005 | pc |
B | 1006 | pc |
B | 2007 | laptop |
C | 1007 | pc |
D | 1008 | pc |
D | 1009 | pc |
D | 1010 | pc |
D | 3004 | printer |
D | 3005 | printer |
E | 1011 | pc |
E | 1012 | pc |
E | 1013 | pc |
E | 2001 | laptop |
E | 2002 | laptop |
E | 2003 | laptop |
E | 3001 | printer |
E | 3002 | printer |
E | 3003 | printer |
F | 2008 | laptop |
F | 2009 | laptop |
G | 2010 | laptop |
H | 3006 | printer |
H | 3007 | printer |
model | speed | ram | hd | price |
---|---|---|---|---|
1001 | 2.66 | 1024 | 250 | 2114 |
1002 | 2.1 | 512 | 250 | 995 |
1003 | 1.42 | 512 | 80 | 478 |
1004 | 2.8 | 1024 | 250 | 649 |
1005 | 3.2 | 512 | 250 | 630 |
1006 | 3.2 | 1024 | 32 | 1049 |
1007 | 2.2 | 1024 | 200 | 510 |
1008 | 2.2 | 2048 | 250 | 770 |
1009 | 2 | 1024 | 250 | 650 |
1010 | 2.8 | 2048 | 300 | 770 |
1011 | 1.86 | 2048 | 160 | 959 |
1012 | 2.8 | 1024 | 160 | 649 |
1013 | 3.06 | 512 | 80 | 529 |
model | speed | ram | hd | screen | price |
---|---|---|---|---|---|
2001 | 2 | 2048 | 240 | 20.1 | 3673 |
2002 | 1.73 | 1024 | 80 | 17 | 949 |
2003 | 1.8 | 512 | 60 | 15.4 | 549 |
2004 | 2 | 512 | 60 | 13.3 | 1150 |
2005 | 2.16 | 1024 | 120 | 17 | 2500 |
2006 | 2 | 2048 | 80 | 15.4 | 1700 |
2007 | 1.83 | 1024 | 120 | 13.3 | 1429 |
2008 | 1.6 | 1024 | 100 | 15.4 | 900 |
2009 | 1.6 | 512 | 80 | 14.1 | 680 |
2010 | 2 | 2048 | 160 | 15.4 | 2300 |
model | color | type | price |
---|---|---|---|
3001 | TRUE | int-jet | 99 |
3002 | FALSE | laser | 239 |
3003 | TRUE | laser | 899 |
3004 | TRUE | int-jet | 120 |
3005 | FALSE | laser | 120 |
3006 | TRUE | int-jet | 100 |
3007 | TRUE | laser | 200 |
编写 SQL 语句如下:
注意:设计时,将 price 项的 Domain 视作两位小数的浮点数,因为理论上钱可以精确到人民币分/美分等,不能排除后续插入的产品的价格不是浮点数。
|
|
执行建库建表和数据插入:
数据插入成功。
习题 6.2.2 查询&查询结果
我们编写 SQL 语句如下。查询结果截图下附。
a) 查询硬盘容量至少 30G 的笔记本电脑制造商及该电脑的速度
|
|
b) 查询制造商 B 生产的任意类型的所有产品的型号和价格
|
|
c) 查询只卖笔记本电脑不卖 PC 的厂商
|
|
d) 查询出现在两种或两种以上 PC 中的硬盘的大小
|
|
e) 查询每对具有相同速度和 RAM 的 PC 的型号。每一对只能列出一次; 例如,若 (i,j) 已被列出,则 (j,i) 就不能再被列出。
|
|
习题 6.3.1 查询&查询结果
a) 找出速度在 3.0 以上的 PC 制造商
方法 1:使用 IN
操作符
|
|
方法 2:使用 EXISTS
操作符
|
|
b) 找出价格最高的打印机
方法 1:使用 MAX
函数和子查询对比
|
|
方法 2:使用 ALL
操作符
|
|
【选作】习题 6.4.6 查询&查询结果
a) 查询 PC 的平均速度:
|
|
b) 查询价格高于 $1000 的笔记本电脑的平均速度:
|
|
c) 查询厂商“A”生产的 PC 的平均价格:
|
|