数据库原理实验入门:从环境搭建到SQL建表与查询
简介来自郑州大学计算机与人工智能学院《数据库系统原理》课程的实验报告资源面向正在学习数据库原理或需要完成同类实验的学生能够帮助快速了解数据库管理系统的工作原理与万里数据库GreatSQL的部署维护。压缩包内为1个docx文档约3.69MB内容围绕数据库实验全流程展开从认识基本表、视图、触发器、存储过程、约束等逻辑组件到在VMware加CentOS 7环境中安装和启动GreatSQL再到关闭SELinux与防火墙、安装依赖包、通过systemd管理服务等具体操作均有详细命令与解释。文档还完整记录了实验过程中可能遇到的问题及解决思路并对实验结果进行分析反思涉及数据库性能与安全性因素正文含大量实验截图配有图编号与图题表格也按编号、表名和规范格式呈现可直接作为实验报告撰写参考。目前已有509人学习浏览特别适合郑州大学在校学生以及自学数据库系统管理的初学者参考。1. 先搞懂一个概念数据库不是Excel到底差在哪很多人第一次听到“数据库原理”这门课第一反应是数据库不就是存数据的吗跟Excel有什么区别还真有区别。Excel适合一个人手动编辑几千行数据数据库要应对成千上万人同时查询和写入还要保证数据不错乱、不丢失、不互相踩脚。数据库管理系统DBMS就是负责干这件事的软件这门实验课的所有内容都围绕“把它装起来、把表建好、把SQL写对”展开。我见过太多人一上来就背SQL语法连环境都没跑起来越学越晕。其实入门的路径很简单先装好一个能跑的数据库再用SQL建表、填数据、查询动手跑通一遍原理自然就懂了。这篇文章就带你把这份实验报告的核心路径走一遍完全零基础、想亲手动手试一试的人照着往下看就行。2. 为什么要学数据库原理先弄清两类组件再动手打开实验报告第一个实验叫“认识DBMS系统”。刚接触的人很容易懵DBMS是什么为什么要先认识它DBMS就是帮你管数据库的那个软件你以后敲的每一条SQL都要交给它处理。如果连它内部有哪些零件都不了解遇到问题就只能把它当成一个黑匣子瞎猜。这一章先把数据库系统的两类组件讲明白一类是你在SQL里能直接操作的逻辑组件一类是真正落在磁盘上的物理组件。搞清楚这两块后面建表和排查问题时你至少知道该往哪个方向看。2.1 逻辑组件基本表、视图、触发器、存储过程、约束到底各管什么数据库系统里有五个常见的逻辑组件我把它们类比成一个公司来理解。基本表就是仓库里的货架数据真正存放在这里。一张表由行和列组成一行是一条完整记录一列是同一个属性。比如学生表里一行就是一个学生列分别叫学号、姓名、性别。所有查询最终都要落到基本表上。视图则是展示橱窗它本身不存数据只是把一张或多张基本表的某些行列组合成一个虚拟表。为什么要用视图比如教务系统里辅导员只需要看学生的姓名和成绩不需要看身份证号那就给他开一个只含这几列的视图既简化了查询又保护了敏感列。触发器像自动门铃你在表里插入、删除、更新数据时它会自动执行一段预先写好的逻辑。例如选课表里每次插入新选课记录就自动把选课人数加一这就是触发器干的活。存储过程相当于预制流水线它把一串SQL语句打包成一个单元并起个名字下次直接调用这个名字就行。比如“统计某专业平均成绩”这个操作需要四五条SQL配合做成存储过程后就能一次调用不用每次重复发一堆语句还减少了网络传输。约束则像公司的规章制度主键约束保证每一行都有唯一标识非空约束保证关键字段不能为空外键约束保证你引用的数据必须真实存在。没有这些约束垃圾数据和断掉的引用关系会越攒越多。这一层是概念层的“看得见摸得着”的组件新手可以通过下面几条命令快速查看它们的元数据SHOW TABLES; -- 查看当前数据库里有哪些基本表 SELECT * FROM information_schema.TRIGGERS; -- 查看已定义的触发器 SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPEPROCEDURE; -- 查看存储过程 SELECT * FROM information_schema.KEY_COLUMN_USAGE; -- 查看主键、外键、唯一键等约束信息这些命令不需要背知道它们是“体检工具”就行。实验一的用意很简单让你亲手把它们查出来亲眼看到数据库里确实存在这些东西而不是只在课本上见过名字。2.2 物理组件数据页、日志文件以及GreatSQL的几项硬实力逻辑组件是概念层的物理组件才是真正落在磁盘上的东西。先说最核心的存储单位数据页。GreatSQL的数据在磁盘上不是一条一条散放的而是按固定大小的“页”为单位读写。你可以把数据页理解成一本书的页码仓库管理员不会一本一本地搬而是一摞一摞地搬数据库也是整页整页地读写这样效率才高。数据以页为单位放在文件中这些文件的位置在/var/lib/mysql目录下。实验里让你执行ls /var/lib/mysql就是要用肉眼看到这些物理文件的存在。除了数据文件还有日志文件。日志就像飞机的黑匣子每次数据变更都会被记录下来万一系统崩溃重启就靠日志把数据恢复到崩溃前的状态。这也是数据库和Excel最大的不同Excel没保存就是丢了数据库有日志兜底。那GreatSQL内部是怎么协同工作的理解下面几个角色就够了连接池是前台接待负责接收客户端连接请求SQL接口是窗口负责接收你发来的SQL语句查询解析器是翻译官把SQL拆成语法树查询优化器是军师决定先查哪张表、走哪个索引、用什么顺序执行可插拔存储引擎是仓库管理员真正负责落盘和读盘默认的是InnoDB引擎。实验报告里还提到了GreatSQL的几项硬实力新手只需要知道大概未来选型时有印象就行它和MySQL高度兼容学会它以后再切到MySQL几乎零成本它的MGR组复制提供高可用方案支持多机房数据同步它改进的InnoDB并行查询在OLAP场景下性能提升明显TPC-H测试平均提升15倍事务锁结构从红黑树优化成无锁哈希高并发场景下更稳。这些特性离日常实验有点远但它能帮你理解一件事为什么很多项目愿意选它做生产库而不是随便用个小工具存数据。3. 第一步怎么迈在虚拟机上装好一个能跑的数据库环境搭建是新手放弃率最高的环节很多人卡在“不知道从哪里下手”。实验报告给的标准路线是虚拟机 Linux系统 GreatSQL数据库。这一章我会把每一步命令拆开讲清楚你跟着敲一遍就能把数据库跑起来。3.1 为什么推荐用虚拟机而不是直接在自己电脑上装第一次装数据库心里最怕的是“把自己电脑搞坏”。虚拟机就是来兜底的它相当于在你电脑里开出一台虚拟的电脑这台虚拟电脑随便折腾装坏了、配置乱了拍个快照就能回到之前的状态所以虚拟机是新手最靠谱的后悔药。数据库生产环境绝大多数跑在Linux上实验报告要求的也是CentOS 7或以上的Linux系统。这不是玄学而是真实工作中的常态数据库这种需要长时间稳定运行的服务几乎都部署在Linux服务器上。所以入门阶段最省心的组合是装一个虚拟机软件比如VMware在虚拟机里装好CentOS 7然后在CentOS里安装GreatSQL。整个过程和在你电脑上安装软件没什么本质区别只是命令行的操作方式需要稍微适应一下。如果你以前只用过图形界面这一章正好把Linux的常用命令也练了。3.2 从零到启动GreatSQL每一步命令和为什么这样操作下面按实验报告的顺序把安装过程走一遍。每一步我都会说明命令在干什么。第一步关闭SELinux和防火墙。setenforce0 sed -i /^SELINUX/cSELINUXdisabled /etc/selinux/config systemctl disable firewalld systemctl stop firewalld第一条命令setenforce0表示当前会话临时关闭SELinux第二条命令修改配置文件让重启后依然保持关闭第三、四条命令是把防火墙禁用并停止。为什么要这么干因为数据库需要读写数据文件、监听网络端口SELinux的强制访问控制策略如果没有为数据库单独配置很可能把它的文件读写和网络通信拦下来防火墙默认也会挡住数据库对外服务的端口。在实验环境里直接关掉这两层限制是最省事的做法。注意一点setenforce0只管当前开机状态配置文件那一条才是永久的很多新手只执行第一条就以为完事了重启后服务照样起不来这个坑后面还会专门讲。第二步安装依赖包。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-Simple这一长串看着吓人其实就是一个命令把数据库运行需要的所有“零件”装齐。pkg-config用来检测系统库libaio是异步输入输出库numactl负责CPU和内存调度openssl用于加密通信jemalloc是内存分配器perl和python2是一批脚本工具net-tools提供网络排查命令。你不必记住每一个包的用途但要知道数据库不是孤零零运行的它依赖系统里很多基础组件缺一个都可能启动失败。第三步下载并解压二进制包。cd /usr/local wget https://www.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.xz把软件包放在/usr/local是Linux安装软件的传统位置wget是下载命令tar xf 则是解压命令。minimal表示精简版只保留核心功能对学习来说完全够用。如果下载速度慢可以找国内镜像站但版本号一定要和实验环境一致否则后面可能出现兼容性问题。解压出来的是一个带版本号的目录比如/usr/local/GreatSQL-8.0.32-25-...后面所有路径都要和这个目录对上。第四步注册成系统服务。为了让数据库能被systemctl这套系统命令管理需要把GreatSQL注册成服务。先创建一个服务文件vim /lib/systemd/system/greatsql.service文件里至少要有下面这几行关键配置ExecStart一定要指向你实际的解压路径[Unit] DescriptionGreatSQL Server Afternetwork.target [Service] Usermysql Groupmysql ExecStart/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqld --defaults-file/etc/my.cnf [Install] WantedBymulti-user.target写完保存后执行systemctl daemon-reload让系统重新加载服务列表。这一步做完GreatSQL就被纳入了systemd管理之后你可以用systemctl start greatsql、systemctl stop greatsql、systemctl restart greatsql这一组命令来管理它不需要每次手动去敲二进制文件路径。这也是生产环境最标准的启动方式。第五步创建系统用户和数据目录。/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数据库服务不能用root身份运行这是安全底线。万一数据库被攻击root权限会把整个系统都暴露出去。所以这里新建一个mysql用户专门用来运行数据库。而/var/lib/mysql是数据文件的存放目录chown -R mysql:mysql是把这个目录和安装目录的所有权交给mysql用户让它有权限读写。第六步启动并验证。systemctl start greatsql systemctl status greatsql ps -ef | grep mysqld ss -lntp | grep mysqld ls /var/lib/mysqlsystemctl status greatsql看到active (running)就说明服务起来了。ps -ef | grep mysqld是在进程列表里找mysqld进程确认它真的在跑ss -lntp | grep mysqld是查看数据库监听的TCP端口ls /var/lib/mysql则是看数据文件是否已经生成。做完这几步你的数据库环境就搭建完成。我第一次学的时候在这套命令里反复折腾了一下午后来才发现自己漏了第二步的依赖包所以遇到问题别慌按顺序排查命令有没有漏跑。提示启动后登录数据库命令是mysql -uroot -p。如果提示找不到临时密码去启动日志里搜索temporary password关键字初始密码一般在那里或者确认/etc/my.cnf里是否配置了免密登录项。4. 第一个实验怎么跑建库、建表、填数据环境就绪后就到了最让人兴奋的部分正式创建自己的数据库和表。这一章把实验二的核心操作拆成两步每一步都给出完整SQL和解释你直接复制粘贴就能跑。4.1 三条SQL把数据库和表立起来CREATE DATABASE、CREATE TABLE、INSERT登录数据库后先创建一个名为DB的数据库CREATE DATABASE DB; -- 创建名为DB的数据库 SHOW DATABASES; -- 查看服务器上有哪些数据库 USE DB; -- 切换到DB数据库CREATE DATABASE是创建数据库的命令SHOW DATABASES可以确认它真的创建成功USE DB则是告诉数据库“我接下来要在DB这个库里操作”。注意每条SQL结尾要加分号这是告诉数据库“这条语句结束了”。接下来在DB库里建三张最基础的课表学生表、课程表、选课表。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) -- 系编号 ); CREATE TABLE COURSES ( Cno char(5) PRIMARY KEY, -- 课程号主键 Cname char(20) NOT NULL, -- 课程名不能为空 Period int, -- 学时 Credit int -- 学分 ); CREATE TABLE SC ( Sno char(9), -- 学号 Cno char(5), -- 课程号 Grade int, -- 成绩 PRIMARY KEY (Sno, Cno) -- 联合主键一个学生一门课只对应一条成绩 );字段类型怎么选这是建表时第一个要过的坎。下面这张表是新手最容易用错的几个类型建议收藏字段示例推荐类型原因学号char(9)长度固定定长字符效率最高姓名char(10)短文本定长字符足够出生日期DATE专门存储日期可以直接算年龄、比大小成绩int整数即可可加CHECK限制范围学时int整数不需要小数主键是这张表的唯一标识插入重复主键时数据库会直接报错。SC表用了联合主键(Sno, Cno)意思是“学号和课程号的组合必须唯一”这正好对应了一个学生一门课只能有一条成绩的业务规则。表建好后往里面填充数据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);INSERT INTO ... VALUES用来插入数据字符串和日期都要加单引号数字直接写。VALUES后面可以一次写多行每行用括号包住逗号分隔这样比一行一行插入高效。填完数据后用SELECT * FROM STUDENTS;验证一下能查出三条学生记录说明表和数据的创建都成功了。4.2 索引是怎么加速查询的建索引、删索引、跑两个最基本的查询索引这个名词听起来很高级其实就是书的目录。没有索引时数据库要查一条记录就得把整张表从头到尾扫一遍数据量大的时候非常慢有了索引数据库直接通过目录定位速度快一个量级。在实验里我们给学生表的系编号字段建一个普通索引给课程表的课程号字段建一个唯一索引CREATE INDEX Student_Dept ON Students (Dno); CREATE UNIQUE INDEX Course_Cno ON Courses (Cno);第一条创建普通索引允许字段值重复因为一个系里有很多学生第二条创建唯一索引要求字段值不能重复因为Cno本身就是主键。建索引不会影响表里的数据它只是额外维护了一份“目录”。如果发现索引设计不合理可以用下面这条命令删掉DROP INDEX Course_Cno ON Courses;接下来是两个最常用的查询建议亲手敲一遍找感觉SELECT * FROM Courses; -- 查询所有课程信息*代表所有列 SELECT Sname, BirthDay FROM Students WHERE Dno CS; -- 查计算机系学生的姓名和生日第一条不带任何条件把整张表的内容全部列出第二条用WHERE指定过滤条件只返回满足条件的行。语法上就是SELECT 列名 FROM 表名 WHERE 条件。这两个查询是你后面写所有SQL的基础后面的多表连接、子查询都是在它们之上叠加更多子句。注意动手做每一步的时候建议顺手截一张图实验报告要求截图要带编号和图题。不要最后统一补截图真到写报告时你会发现当时没留还得重跑一遍白白浪费时间。5. 新手避坑指南安装和建表最容易翻车的几个点这一章把新手最容易踩的坑集中列出来每一条都是先讲现象再讲原因最后给解决办法。看完这一章你至少能少走一晚上的弯路。5.1 服务启动失败状态显示failed现象执行systemctl start greatsql后systemctl status greatsql显示Active: failed数据库起不来。原因最常见的是SELinux没有真正关闭。很多人只运行了setenforce0这个命令只对当前开机生效重启后SELinux又自动开启了照样拦截数据库进程。另一个常见原因是数据目录权限不对mysql用户没有/var/lib/mysql的写权限。解决先确认/etc/selinux/config文件里的SELINUXdisabled已经写上并重启过虚拟机然后查看错误日志执行journalctl -u greatsql或查看日志文件重点看有没有Permission denied或Cant create/write to file这类字眼有的话执行chown -R mysql:mysql /var/lib/mysql修正所有权。5.2 输入mysql命令提示 command not found现象在终端里敲mysql -uroot -p系统提示找不到这条命令。原因安装目录没有加入系统的PATH环境变量shell不知道去哪里找mysql这个程序。这是Linux新手的经典翻车现场不是你的数据库没装好而是缺少“路径指引”。解决先用绝对路径登录把安装路径补全/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysql -uroot -p登录成功后可以做一个软链接一劳永逸ln -s /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysql /usr/bin/mysql之后直接敲mysql就能用了。5.3 字段类型选错数据怎么都插不进去现象生日字段插入1999年12月16日报错想在性别字段上限制只能填“男”或“女”却不知道怎么做。原因字段类型没选对。日期用了字符串类型类型转换出问题性别字段没有加约束任何文本都能塞进去。数据插不进去或者想限制的没限制住十有八九是表结构设计的问题。解决日期字段用DATE类型插入时写成1999-12-16这样的标准格式性别字段用char(2)并加上检查约束CREATE TABLE Teachers ( Tno char(7) PRIMARY KEY, Tname char(10) NOT NULL, Sex char(2) CHECK (Sex 男 OR Sex 女) );成绩字段同理加CHECK (Grade 0 AND Grade 100)数据库就会帮你拒绝不合法的成绩。5.4 插入数据报主键冲突或外键失败现象向表里插入数据时报Duplicate entry for key PRIMARY或Cannot add or update a child row: a foreign key constraint fails。原因主键冲突是因为你要插入的学号或课程号在表里已经存在。外键失败是因为你引用了尚不存在的记录比如给一个还没在STUDENTS表里出现的学生添加选课记录外键约束会直接拒绝。解决先执行SELECT * FROM 表名;查看当前已有数据确认主键值没重复。插入有外键关联的表时记住一个顺序原则先插父表被引用的表再插子表引用别人的表。比如先给STUDENTS插入学生再往SC里插入这个学生的选课记录就不会报错了。5.5 中文全部变成问号“???”现象明明插入的是中文姓名查询出来全是???或显示乱码。原因客户端连接数据库时两边使用的字符集不一致。服务器默认可能是latin1或utf8mb4而客户端连接没有指定字符集中文在传输过程中被转成了问号。解决登录数据库后先执行一条命令临时解决SET NAMES utf8mb4;更彻底的办法是在建库时就指定字符集CREATE DATABASE DB DEFAULT CHARACTER SET utf8mb4;这样建出来的库从存储到连接都使用统一的utf8mb4编码中文就不会再乱码了。6. 下一步学什么从实验报告走向真实项目环境搭好了第一个实验也跑通了接下来最该做什么我的建议是别急着啃大量理论按下面这条路径往前走。第一件事把交互式SQL练熟。实验报告里列出的各类查询操作包括不带WHERE的查询、带WHERE、BETWEEN范围、IN集合、DISTINCT去重全部在你的表上亲手敲一遍。这部分练得越熟后面写多表连接、子查询就越顺。练完之后可以给自己布置一个小任务查一下“每个系有多少学生”“成绩不及格的学生有哪些”用SQL回答出来比对着课本抄十遍管用得多。第二件事搞懂事务和锁。数据库最怕的不是数据多而是很多人同时读写同一份数据。事务保证一组操作要么全部成功、要么全部回滚锁保证并发时不互相踩脚。实验报告里提到的InnoDB事务锁优化就是朝着这个方向走的。建议去搜几个经典的并发案例比如“两个人同时买最后一张票”看看数据库是怎么处理的这一块理解深浅直接决定你和别人拉开差距的地方。第三件事学会备份和恢复。我用一次惨痛经历来说明它的重要性我有一次在测试库里执行错了一条DROP语句整张表瞬间没了当时没有备份只能对着屏幕发呆。从那以后每次建表前我都强制自己先写一份简单的设计说明再动手敲SQL。备份的命令非常简单mysqldump -uroot -p DB backup.sql就能把整个DB库导出成一个SQL文件恢复时mysql -uroot -p DB backup.sql就行。这个习惯希望你也从一开始就养成。第四件事动手做一个“模拟项目X”。比如做一个班级选课系统把课程、学生、选课这三张表串起来然后用上视图查成绩只看必要列、存储过程统计平均成绩、触发器插入选课记录自动更新人数。做完这个小项目你就不再是只会写单条SQL的新手了而是真正理解了数据库怎么为一个系统服务。这份实验报告里的实验一到实验九其实就是按“环境搭建→建库建表→交互式SQL→索引→事务”这条路径设计的下载下来对照着做比自己从零摸索快很多。我第一次学的时候以为会写SELECT就够了后来把一张表删错才明白备份和约束比炫技重要。希望帮到你。本文还有配套的精品资源点击获取