简介:《数据库系统原理》课程实验报告完整呈现了郑州大学计算机与人工智能学院数据库原理实验的核心内容,适合正在学习DBMS概念、需要完成同类实验报告的本校学生或数据库初学者。报告以万里数据库GreatSQL为操作对象,完整记录了从虚拟机CentOS环境搭建到数据库安装、启动、停止的管理流程,包括关闭SELinux与防火墙的原因分析与命令、依赖包安装、二进制包解压、mysql用户创建等细节;同时梳理了基本表、视图、触发器、存储过程、约束等逻辑组件,并对实验结果和遇到的问题进行了反思与分析。报告按实验一至实验九组织,包含演示和验证等实验类型,图表和截图均按规范编号,既能帮助理解DBMS系统架构,也可作为实验报告撰写和数据库环境搭建的参考模板。压缩包共1个docx文档,大小3.69MB,内容结构完整,便于直接查看。已有509人学习下载,对于需要构建GreatSQL实验平台、提升数据库系统管理技能的读者具有实用参考价值。
1. 数据库原理实验到底在学什么:先认识DBMS这个「大管家」
很多人第一次听到「数据库原理实验」这几个字,脑子里冒出来的是各种概念:表、视图、触发器、事务、索引……听起来像一堆黑话,其实这门课要做的就一件事——亲手把一个叫 GreatSQL 的数据库管理系统装到虚拟机上,然后通过命令行跟它对话,建库、建表、插数据、写查询。数据库管理系统(DBMS)扮演的角色就像一个大型仓库的物业团队:你只需要告诉它「我要存一箱货」「我要查这批货在哪」,它负责把数据安排得明明白白。这门实验课特别适合刚上完数据库原理课、对 SQL 还很生疏、需要交一份完整实验报告的新手。读完这篇,你会知道从哪下手、每一步在做什么、遇到报错怎么自己解决。
2. 搭建环境并装好GreatSQL:虚拟机、防火墙与首次启动
先别急着敲命令,花三分钟想清楚一件事:为什么实验要在虚拟机里做,而不是直接在自己电脑上装一个数据库?
2.1 为什么第一步是虚拟机:给你的数据库一个「安全沙盒」
虚拟机就是在你的真实电脑里用软件模拟出一台完整的计算机,你可以在这台「假电脑」里随便折腾。数据库实验要改系统配置、要关安全服务、要装各种软件,一旦出了问题——比如配置文件改坏了、服务起不来了——真实电脑会受影响,虚拟机则可以直接还原到之前的快照,相当于吃了一颗后悔药。
我第一次学的时候觉得虚拟机多此一举,直接在本机装数据库,结果卸载时注册表、服务残留一大堆。后来老老实实跟着实验步骤用虚拟机,装坏了就快照还原,半小时就能回到干净状态。虚拟机软件用 VMware 或同类产品,实验环境要求 CentOS 7 或以上版本。用虚拟机的另一个理由是它和真实服务器环境更接近——你以后在服务器上部署数据库,流程几乎一样。
2.2 关闭SELinux和防火墙:两个「开门」动作
装好系统后,实验第一步不是装数据库,而是先调整系统安全配置。原文实验过程里有四条命令,我带着你逐条看:
setenforce=0 sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config systemctl disable firewalld systemctl stop firewalld第一条setenforce=0是临时把 SELinux 从「强制模式」改成「宽容模式」,让当前这台机器立刻不再拦截特权操作。第二条是把 SELinux 的配置文件永久改成 disabled,重启之后也不会再开启。第三、四条分别让防火墙服务停止并禁止开机自启。
为什么要关 SELinux?SELinux 是一种强制访问控制机制,它会给每个进程规定能干什么、不能干什么。数据库启动时要读写文件、要监听网络端口,这些属于高权限操作,SELinux 可能拦下来,表现就是你明明把数据库装好了,它却起不来,报错还很模糊。关防火墙的原因更直接:数据库默认用 3306 端口和客户端通信,防火墙不防行这个端口,客户端连上来会被拒。在虚拟机里做开发测试,关掉防火墙可以省掉大量「为什么连不上」的排查时间。
注意:关闭 SELinux 和防火墙是学习实验环境下的操作。真实服务器上要按最小权限原则配置安全策略,不能照搬。
2.3 安装依赖包:把数据库需要的「零件」提前装齐
GreatSQL 不是个孤零零的程序,它运行时要调用系统里很多现成的库文件。缺了这些库,安装时可能不出错,启动时才会蹦出一堆「找不到 libxxx.so」的报错,那时候再回头排查更麻烦。所以实验里先执行这条命令把依赖一次装齐:
yum install -y pkg-config perl libaio-devel numactl-devel numactl-libs \ net-tools openssl openssl-devel jemalloc jemalloc-devel \ perl-Data-Dumper perl-Digest-MD5 python2 perl-JSON perl-Test-Simpleyum是 CentOS 的包管理器,-y表示安装过程中所有提问都自动回答 yes。这么多包,不用每个都记住,只需知道几类:
| 依赖包 | 作用 |
|---|---|
| libaio-devel | 提供异步 I/O 接口,数据库读写磁盘时要用 |
| numactl-devel / numactl-libs | 让数据库感知 CPU 和内存的物理分布,优化性能 |
| openssl / openssl-devel | 提供加密通信能力,数据库连接加密需要 |
| jemalloc / jemalloc-devel | 一个更高效的内存分配器,减少内存碎片 |
| net-tools | 提供 ss、netstat 等网络排查命令 |
装完依赖,环境准备就完成了。命令行界面不熟悉没关系,跟着敲,敲错了用方向键上翻重新编辑再回车就行。常用的其实就cd(进入目录)、ls(列出文件)、vim(编辑文件)三五个命令。别被黑乎乎的终端吓住,多敲几次就熟了。
2.4 下载并解压二进制包:把数据库「安置」进系统
依赖装好后,开始下载 GreatSQL 本体。实验用的是二进制包——可以理解成已经编译好的数据库程序,下载下来解压就能用,不需要你自己去编译源码。步骤是先把包放到/usr/local目录,再解压:
cd /usr/local wget https://product.greatdb.com/GreatSQL-8.0.32-25/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xzwget是命令行下载工具,后面跟的是包的下载地址。要注意,这个地址和你课程要求的版本相关,如果你们用的是其他版本,把文件名替换成你们提供的二进制包名。tar xf是解压命令,xf分别表示「解压」和「指定文件」,它会自动识别.tar.xz格式。
解压完成后,/usr/local下会出现一个带版本号的目录,数据库程序就在这里。为什么要放在/usr/local?这是 Linux 系统约定俗成的第三方软件安装目录,让系统其他部分知道「额外装的软件都在这」。
2.5 注册systemd服务:让数据库受系统统一管理
数据库程序已经在硬盘上了,但系统和它还没有「正式关系」——你还不能用systemctl start greatsql这种标准化命令去控制它。这一步要做的就是给系统注册一个服务。先编辑服务文件:
vim /lib/systemd/system/greatsql.service这个文件里写的是服务的基本信息:启动时执行哪条命令、用什么用户运行、失败时怎么处理。vim 编辑器的用法:按i进入输入模式,编辑完按Esc,然后输入:wq保存退出。不会用 vim 也没关系,记住这三个操作就能应付。保存后,让 systemd 重新读取配置:
systemctl daemon-reloadsystemd 是 CentOS 7 开始负责管理系统服务的组件,可以理解成「系统的调度中心」。daemon-reload是在告诉它「我新加了一个服务,请重新扫描一遍配置目录」。执行完这条命令,GreatSQL 就成了系统里的正式服务。
接下来要做两件准备工作:创建专用的系统用户和目录。为什么要单独建一个 mysql 用户?出于安全考虑——数据库程序用普通用户身份运行,即使被攻击,攻击者拿到的也不是 root 权限,破坏面会小很多。
/sbin/groupadd mysql /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin mkdir /var/lib/mysql chown -R mysql:mysql /var/lib/mysql /var/log /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal组和用户的名字都叫 mysql;/sbin/nologin表示这个用户不能登录终端,只用来跑服务。/var/lib/mysql是数据库将来存放数据文件的地方,chown -R把相关目录的属主改成 mysql,让数据库进程对它们有读写权限。还要编辑一下全局配置文件/etc/my.cnf,在里面指定数据目录、端口、字符集等参数。初学者先不用深究每一项,知道「MySQL 系数据库启动时会去读这个配置文件」即可。
2.6 启动并验证:三行命令确认数据库「活着」
一切就绪,启动数据库:
systemctl start greatsql启动后立刻看状态:
systemctl status greatsql看到active (running)就说明服务正常。然后从三个角度验证:看进程、看端口、看数据文件。
ps -ef | grep mysqld ss -lntp | grep mysqld ls /var/lib/mysqlps -ef列出所有进程,grep mysqld只留下名字里带 mysqld 的——mysqld 是数据库的服务进程名;ss -lntp查看端口监听情况,能看到 3306 端口被 mysqld 占用,说明数据库已经在等待客户端连接;ls /var/lib/mysql能看到数据目录里自动生成了一批文件,这就是数据库的「物理实体」。到这里,你拥有了一个跑起来的数据库管理系统。原文还提到 GreatSQL 的几个特色能力——MGR 高可用组复制、InnoDB 并行查询、事务锁优化等,这些是它区别于普通 MySQL 的地方,实验阶段先混个眼熟即可。
3. 装好后先搞懂这些概念:基本表、视图、触发器、存储过程与数据页
数据库装好了,但第一次连上去时看着黑屏不知道下一步该干嘛。在动手建表之前,先把数据库系统里的几个核心组件搞明白。这些词在课上听老师讲总觉得抽象,其实每个都对应一个很朴素的工具。
3.1 基本表:数据库里真正的「实体仓库」
基本表是数据库中真实存储数据的表,也可以叫实体表。它和你日常用的 Excel 表格几乎是一回事——有行有列,列定义了这条数据有哪些字段(比如学号、姓名),行是一条条真实数据。区别在于数据库表对每一列的数据类型有严格约定,不能像 Excel 那样随便填。
一个数据库里通常有好几张基本表,它们通过公共字段相互关联。想看当前数据库里有几张表,用SHOW TABLES;。表是数据库一切业务的底座,视图、触发器、存储过程、索引,全都是围绕基本表展开的。理解了表,就理解了数据库的一半。
3.2 视图:一张「看起来存在」的虚拟表
视图是数据库里最容易让新手困惑的概念。一句话解释:视图不存数据,它只是一个保存好的查询规则。当你执行 SELECT 从视图取数时,数据库会现场执行它背后的那段查询,把结果拼成一张临时表给你看。
举个例子,你有一张全校学生表和一张成绩表,想经常查「每个学生的平均分」。每次写一遍关联查询很烦,不如创建一个视图,把这段查询封装起来。从此以后,SELECT * FROM 视图名就能拿到结果——你看到的是一张表,实际上它背后是一段自动执行的查询。
视图的好处有三个:一是简化复杂查询,把高频 SQL 封装起来;二是隐藏敏感列,比如只暴露姓名和专业,不暴露身份证号;三是逻辑隔离,底层表结构改了,视图可以不变,上层应用不用动。注意,视图不存数据,你对视图的插入、更新操作最终要落到基本表上,数据库会严格检查。
3.3 触发器、存储过程与约束:三样「自动化工具」
这三个概念放在一起讲,因为它们都是「让数据库替你干活」的机制。
触发器是挂在某张表上的自动逻辑,监听特定事件——插入、更新、删除。比如每次往订单表插入一条记录时,触发器自动往日志表写一条「某时某分插入了一条订单」。它适合做数据一致性维护,比如删除一个学生的同时,自动把和他关联的选课记录也删掉。触发器不需要你调用,事件一发生,它就自己执行。
存储过程则是一段预先写好、可被反复调用的 SQL 逻辑块。它和程序里的「函数」很像:定义一次,以后 CALL 一下就能执行。优点是逻辑放在数据库里,多个应用都能调用;SQL 在网络上传送的只是「调用命令」,而不是一大堆语句,减少网络开销。
约束是定义在表上的规则,最常见的是主键约束、外键约束、唯一约束、非空约束。主键约束保证每一行有唯一标识,外键约束保证你引用的数据一定存在。约束的价值在于:把「数据不能乱填」的规则交给数据库强制执行,而不是靠写程序的开发人员自觉。约束就像表格填写时的校验规则——填错了,数据库直接拒收。
| 组件 | 存不存数据 | 干什么用 | 需不需要手动调用 |
|---|---|---|---|
| 基本表 | 存 | 数据的实体仓库 | 直接操作 |
| 视图 | 不存 | 封装查询、隐藏列 | 像表一样查询 |
| 触发器 | 不存 | 监听事件自动执行逻辑 | 事件触发 |
| 存储过程 | 不存 | 封装一堆 SQL,便于复用 | CALL 调用 |
| 约束 | 不存 | 保证数据的完整性 | 建表时定义 |
3.4 物理存储:数据页和磁盘里的文件
逻辑组件是你用 SQL 看到的「表」,物理组件则是这些数据在硬盘上的真实形态。GreatSQL 的物理存储单位是数据页(Page),你可以把它想成书的纸张:表里的数据按固定大小切成一个个数据页,页再组成文件,存在磁盘上。数据文件的默认位置,就是之前创建的/var/lib/mysql。
一套典型的数据库系统,进程跑起来之后大致包括这些角色:连接池负责接待客户端连接,SQL 接口接收你发来的语句,解析器把你的 SQL 拆解成数据库能理解的结构,优化器分析出「用索引查还是全表扫」的路径,最后存储引擎真正去读写磁盘上的数据页。日志文件则记录每一步操作,用于崩溃恢复和备份。
这一层不用死记,只需要建立整体印象:你每敲一句 SQL,数据库都经历「接收 → 解析 → 优化 → 执行 → 读写磁盘」这条流水线。知道了这条流水线,后面学性能优化、学事务,心里才有坐标。
4. 第一个完整例子:创建数据库、三张表和一条索引
现在进入真正动手的环节。目标是用 SQL 造出一个完整的数据库小世界:一个叫 DB 的数据库,里面有三张表——学生表、课程表、选课表,然后填进几条数据,再建两个索引。整个过程十分钟能跑完,跑完你对 SQL 的感觉就完全不一样了。
4.1 登录数据库:第一次用命令行和数据库对话
数据库服务已经在跑了。怎么进去?用数据库自带的命令行客户端。GreatSQL 安装目录的 bin 文件夹下有一个 mysql 程序,它是官方提供的交互式客户端。登录命令:
/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysql -uroot -p-uroot表示用 root 用户登录,这是数据库的超管账号;-p表示要输入密码,回车后会提示你输入安装时设置的 root 密码。看到提示符变成mysql>,就说明你已经进入数据库的交互界面。从这一刻起,你敲的每一条语句都会发送给数据库执行;语句结尾要打分号;,它表示「这句话说完了,请执行」。嫌路径太长的话,可以把 bin 目录加入 PATH 环境变量,以后直接敲mysql就行。
4.2 创建数据库:三行 SQL 拿到入场券
数据库系统可以同时管理多个独立的「库」,就像一个大楼里有很多办公室。先建一个属于你的办公室:
CREATE DATABASE DB; -- 创建一个名为 DB 的数据库 SHOW DATABASES; -- 列出系统里所有数据库 USE DB; -- 切换到 DB 这个库第一行创建数据库;第二行查看创建结果,DB 应该出现在列表里;第三行是告诉数据库「接下来我都操作 DB 这个库」。后面建表、插数据,都在 DB 里面进行。
提示:SQL 关键字(CREATE、SHOW、USE)不区分大小写,但为了可读性,通常习惯用大写,表名和数据库名按教材保持一致即可。
4.3 创建三张表:主键、数据类型与约束
数据库有了,里面是空的。现在创建第一张表——学生表。每条规则都要理解清楚:
CREATE TABLE STUDENTS ( Sno char(9) PRIMARY KEY, -- 学号,9位,主键,不能重复 Sname char(10) NOT NULL, -- 姓名,不能为空 Sex char(2), -- 性别 Birthday DATE, -- 生日,日期类型 Speciality char(20), -- 专业 Dno char(4) -- 系别编号 );逐行解读。Sno char(9) PRIMARY KEY:学号是固定长度 9 个字符;主键意味着这一列的值在表里不能重复——两个人不能有同一个学号。Sname char(10) NOT NULL:姓名不能为空。Birthday DATE:生日用日期类型;Dno char(4)是系别编号,4 个字符,比如 CS 表示计算机系。
同样方式建课程表和选课表:
CREATE TABLE Courses ( Cno char(5) PRIMARY KEY, -- 课程号,5位,主键 Cname char(20) NOT NULL, -- 课程名,不能为空 Period int, -- 学时 Credit int -- 学分 ); CREATE TABLE SC ( Sno char(9), -- 学号 Cno char(5), -- 课程号 Grade int, -- 成绩 PRIMARY KEY (Sno, Cno) -- 联合主键 );注意 SC 表的特点:主键是(Sno, Cno)两个字段合起来的联合主键。为什么不用单独的 ID?因为选课表记录的是「某个学生选了某门课」这个事实:一个学生可以选多门课,一门课可以被多个学生选,只有「学生 + 课程」的组合才是唯一的。联合主键就是在告诉数据库:同一对 (Sno, Cno) 只能出现一次,防止重复选课。
4.4 插入数据:让表里真正有内容
表结构建好了,现在往里填数据。INSERT 语句的格式是INSERT INTO 表名 VALUES (值1, 值2, ...),值必须和建表时的列顺序一一对应:
INSERT INTO STUDENTS VALUES ('201705001', '张华', '男', '1999-12-16', '计算机', 'CS'), ('201705002', '张晓霞', '女', '1999-01-01', '软件工程', 'SE'), ('201706001', '李玉', '女', '1999-10-17', '数学', 'MA');一次插入了三行数据,多行之间用逗号分隔,最后一行用分号结束。字符类型要用单引号括起来,日期也写成字符串,数据库会自动转换。如果列的个数和值对不上、类型对不上,数据库会立刻报错——这时候不要慌,先检查有没有少写引号、多写逗号。
用同样的方式给课程表和选课表填数据:
INSERT INTO COURSES VALUES ('CS101', '计算机科学导论', 2, 1), ('CS102', '数据库系统', 4, 4), ('CS103', '操作系统', 4, 3); INSERT INTO SC VALUES ('201705001', 'CS101', 89), ('201705002', 'CS102', 92), ('201705003', 'CS101', 88);插完后可以验证一下:
SELECT * FROM STUDENTS; -- 查看学生表全部数据 SELECT * FROM COURSES; -- 查看课程表全部数据 SELECT * FROM SC; -- 查看选课表全部数据SELECT * FROM 表名是查询表的全部行和列,*表示所有列。看到三张表都有数据,说明你已经完成了「建库 → 建表 → 插数据」的全流程。
4.5 创建和删除索引:给查询加速的「目录」
表里数据多了以后,按某个字段查找会变慢。索引就是给表加的目录——数据库额外维护一份排序后的字段值列表,查询时直接按目录定位,不用一行一行扫。
CREATE INDEX Student_Dept ON Students (Dno); -- 在系别列上建索引 CREATE UNIQUE INDEX Course_Cno ON Courses (Cno); -- 在课程号上建唯一索引第一行在 Students 表的 Dno 列上建一个普通索引,名字叫 Student_Dept;第二行在 Courses 表的 Cno 列上建一个唯一索引 Course_Cno。UNIQUE意味着这一列的值不能重复——课程号本来就不可能重复,所以建唯一索引很合理。索引不是越多越好,它虽然加速查询,但每次插入、更新数据时数据库都要额外维护索引,所以实验里只对最常用的查询字段建索引。
删除索引用 DROP INDEX:
DROP INDEX Course_Cno ON Courses; -- 删除课程号上的索引执行后索引就没了。这条命令用于验证索引的创建和删除是对称操作。
4.6 第一个查询:让数据回答你的问题
最后,写两条真正的查询,感受一下数据库的「回答」能力。
SELECT Sname, 2024 - YEAR(Birthday) AS Age FROM STUDENTS;这句话的意思:从 STUDENTS 表里取出姓名,并用 2024 减去生日年份,算出一个年龄,显示在Age这一列。YEAR(Birthday)是取日期字段的年份,AS Age是给这一列起一个显示名字。运行后,你会看到三个学生连同算出的年龄一起输出——数据开始流动了。
再加一条带条件的:
SELECT * FROM STUDENTS WHERE Speciality = '计算机'; -- 只查计算机专业的学生WHERE子句是查询的核心,它筛选出满足条件的行。这条语句只返回专业是「计算机」的学生。到这里,你已经把建库、建表、插数据、建索引、查数据全部走了一遍——这就是数据库原理实验最核心的能力闭环。
5. 新手最容易踩的四个坑:从连不上服务到写不好报告
实验报告里「遇到的问题及解决」是每次必填的项目。这里把新手最常翻车的四个点提前摆出来,每条都是别人踩过的坑,给你现成的排查思路。
5.1 服务连不上:先分清「没启动」和「端口没开」
现象:输入登录命令后等很久,报错ERROR 2003 (HY000): Can't connect to MySQL server。
原因:两类最常见。一是数据库服务根本没启动,二是服务启动了但端口不对或无法访问。很多人在虚拟机里改了配置后重启过系统,数据库不会自动跟着启动,于是客户端连不上。还有人把客户端跑在宿主机上,而虚拟机里的防火墙没关,3306 端口被挡在外面。
解决:先看服务状态systemctl status greatsql,如果显示 inactive(dead),执行systemctl start greatsql再试。如果服务是 active 但还连不上,用ss -lntp | grep mysqld查看端口监听情况,确认端口确实是 3306。如果端口没监听,检查/etc/my.cnf里的 port 配置;如果监听正常但连不上,检查客户端连接时有没有指定主机地址,从宿主机连接虚拟机时要写虚拟机的 IP。
5.2 数据插不进去:主键冲突还是外键没人要
现象:执行 INSERT 语句后报ERROR 1062 (23000): Duplicate entry,或者ERROR 1452: Cannot add or update a child row。
原因:1062 是主键重复——你插入了和已有行相同的主键值。1452 是外键约束失败——你给 SC 表插入一个学号,但这个学号在 STUDENTS 表里不存在;或者你删除了一个仍被其他表引用的记录。
解决:如果是主键冲突,先查一下表里是否已经有这条数据,或者看看是不是多次执行了同一条 INSERT 导致重复插入。如果是外键失败,先确认被引用的表里确实存在对应记录,再执行插入。记住顺序:先插父表,再插子表;删除时反过来,先删子表,再删父表。这一步理解了,外键约束的价值也就体会到了。
5.3 命令一敲就报语法错误:多半是引号和分号
现象:明明照着教材抄的语句,执行时报ERROR 1064 (42000): You have an error in your SQL syntax。
原因:这是 SQL 新手最常见的问题。十有八九出在两个地方:一是字符串用了中文引号,教材里如果是全角引号,直接复制会出错;二是语句结尾漏了英文分号。再就是不留意把关键字拼错,比如 SELECT 少了个 T。我见过有人把'计算机'敲成全角单引号,数据库根本不认。
解决:发现报错先看报错信息里提示的位置——通常它会用箭头指向出错的地方。把字符串里的引号全部改回英文单引号,确保每条完整语句以英文分号结尾。被 1064 折磨过后,我现在养成的习惯是:凡是批量执行的 SQL,先写进一个.sql文件,再用source 文件名.sql执行,这样能直接看到是哪一行出了问题。
5.4 实验做完却写不出报告:问题在于没有边做边记
现象:实验课上数据库装好了、表建好了、截图也拍了一堆,但回到宿舍打开文档却一个字都写不出来——不知道实验目的怎么填、问题怎么总结。
原因:报告不是最后从零「编」出来的,而是过程中「记」出来的。很多新手做实验时只盯着终端,没有记录命令、没有标记每一步解决什么问题,到了写报告时就成了无米之炊。之前有个同学,实验做完了,笔记上一片空白,最后只能凭记忆硬凑,写出来的报告自然又空又假。
解决:做实验时开一个笔记软件,按时间记录:执行了哪条命令、命令作用是什么、输出结果长什么样(关键部分截图)、有没有报错、怎么解决的。每完成一个小步骤,随手截图并命名(图1 安装完成、图2 进程状态),后面写报告时直接按顺序铺开。实验报告的三个必写板块——实验目的、实验过程、问题及总结——对应笔记里的三部分,笔记有了,报告就是在整理,不是在编造。再把截图编号、表格编号规范一下,一份合格的实验报告就出来了。
6. 下一步学什么:从「会做实验」到「真正懂数据库」
到这里,你已经亲手安装了一个真实的数据库管理系统,建了自己的库和表,写出了第一条能回答问题的 SQL。这个起点其实比很多人想象的重要——数据库不是靠「看」学会的,是靠一行行命令练出来的手感。接下来往哪个方向走,给你一条不绕弯的路径。
第一步,把 SQL 练熟。实验三的查询内容是最好的练习题:带条件的 WHERE 查询、BETWEEN 范围查询、IN 集合判断、DISTINCT 去重、多表连接查询。建议你拿今天建的 STUDENTS、COURSES、SC 三张表,把教材里的查询实例全部跑一遍,每跑一条就问自己:这条语句过滤了什么、返回了几行、为什么是这个结果。SQL 就像学自行车,练够里程自然就会了。
第二步,去理解索引和性能。把实验里的索引删了重建,再用EXPLAIN SELECT ...看执行计划,你会看到同样的查询在有无索引时走了完全不同的路径——全表扫描还是索引查找。这是从「会写 SQL」迈向「能调优 SQL」的关键一步,也是面试里数据库考察的高频点。
第三步,理解事务和并发。去查一下 InnoDB 引擎怎么处理事务提交、回滚,什么是读已提交、可重复读,为什么实验提到它优化了事务锁。这一步开始进入数据库原理课的核心理论区,配合实验里的命令慢慢验证,理论就不再是空中楼阁。
第四步,接触高可用和真实场景。原文提到的 MGR 组复制、仲裁节点、并行查询,是生产环境才用得上的能力。不用急着全学会,先知道「数据库挂了怎么快速恢复」「多台数据库怎么同步数据」这两个方向,等你以后进公司、碰真实业务,会发现这些都是救命的东西。
从那以后,我每次做实验都强制自己走一遍「先写笔记 → 再敲命令 → 做完立刻截图 → 最后整理报告」的流程,被报错折磨的次数反而越来越少了。数据库是个越练越有底气的东西,报错信息就是它给你的最有价值的提示,多读几次,你会发现自己能看懂的东西越来越多。希望帮到你。
本文还有配套的精品资源,点击获取