尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL数据库实验资源包:从SQL语法到B+树实现全解析
简介面向华中科技大学“数据库系统原理实践”课程及同等MySQL学习需求者这份压缩包完整收录了课程全部实验关卡适用于Windows环境下的MySQL动手练习。资源以MySQL为实践工具系统覆盖数据库与表的创建及完整性约束、表结构修改、数据查询与增删改、视图、存储过程与事务、触发器、安全性控制、并发控制与隔离级别、备份与介质恢复以及数据库设计与实现等核心模块既适合零基础入门也可用于考前综合复习。包内共92个文件以62个SQL脚本为主体同时包含7个Java文件、6个C文件分别对应数据库应用开发与B树索引实现、4个shell备份脚本以及任务书、报告模板、评分细则、ER图与说明文档等辅助材料整体仅有1.42MB目录按实验和关卡序号组织便于快速检索。目前已有67人学习下载可有效帮助在校学生对照实验要求自查SQL编写、理解事务与并发机制并作为课程设计与期末复习的参考底稿。1. 某高校数据库实践资源包从SQL语法到B树实现一份能跑通的完整实验链最近我把一份“数据库系统原理实践以MySQL为例”的资源包完整拆了一遍。它不是零散的SQL题集而是按实验流程组织的全套操作文件建库建表、完整性约束、查询、视图、存储过程、触发器、事务隔离、并发控制、备份恢复、安全性控制、数据库设计、Java应用开发甚至还有一份B树索引的C源码实现。你拿到手后不需要再四处搜语法只需要在Windows环境装好MySQL按实验顺序依次执行就能把数据库原理课程的核心知识点完整跑通。适合的人正在上数据库实验课的学生、想补实验经验但不想从零搭环境的开发者以及需要一份可复现实验教程的从业者。2. 资源包内部结构按实验顺序看14个实验模块和文件命名这一章先建立地图。资源包的文件夹命名规则很简单文件夹名对应实验主题文件名就是实验关卡的序号。比如“6. MySQL - 存储过程与事务”目录下是1.sql、2.sql、3.sql分别对应任务书里第1、2、3个关卡。这种命名方式对学习者很友好可以直接按序号执行也可以对照报告模板逐关卡写结论。2.1 14个实验模块的时间线与重点资源包从实验1到实验14基本遵循数据库原理课程的教学顺序。我用一个表格整理出来序号文件夹名核心内容1数据库、表与完整性约束的定义(Create)建库、建表、主键外键、默认值、CHECK约束2表结构与完整性约束的修改(ALTER)ADD/DROP COLUMN、修改约束、重命名表3数据查询(Select) 以及之二单表查询、聚合、连接、子查询、理财场景的复杂查询4数据的插入、修改与删除INSERT、UPDATE、DELETE事务性删除场景5视图CREATE VIEW、UPDATE视图、WITH CHECK OPTION6存储过程与事务创建存储过程、事务控制、隔离级别演示7触发器BEFORE/AFTER、FOR EACH ROW、更新审计8用户自定义函数CREATE FUNCTION、函数调用场景9安全性控制GRANT/REVOKE、创建用户、权限管理10并发控制与事务隔离级别多个SQL模拟脏读、不可重复读、幻影读11备份日志介质故障与数据库恢复使用shell脚本执行逻辑备份、二进制日志恢复12数据库设计与实现(rbac)ER图、RBAC权限模型、关系模式转换13数据库应用开发(JAVA篇)JDBC连接、增删改查、预编译语句14数据库的索引B树实现C源码页面结构、内部节点、叶子节点、迭代器、删除这个顺序是有讲究的实验1-4是最基础的SQL操作实验5-8开始接触数据库对象视图、存储过程、触发器、函数实验9-11进入安全、事务和恢复实验12则是一个综合设计项目把前面的建表、查询、权限都用在了RBAC权限系统上。实验13和14是能力拔高分别从业务层和存储引擎层看数据库。2.2 两个值得细看的文件组存储过程与RBAC设计资源包里最容易被忽视但很值得翻开的是实验6的存储过程文件。我截取一段它在“存储过程与事务”中的典型写法DELIMITER $$ CREATE PROCEDURE sp_fund_sales_summary(IN p_period DATE) BEGIN DECLARE v_total_sales DECIMAL(12,2); SELECT SUM(amount) INTO v_total_sales FROM sales WHERE sale_date p_period; SELECT p_period AS sale_date, v_total_sales AS total_amount; END$$ DELIMITER ;这段代码刻意用了DELIMITER $$来分隔存储过程体避免客户端把分号当成语句结束符。IN p_period DATE表示输入参数DECLARE声明局部变量INTO把查询结果写进变量。实验里让你写这样的过程主要是理解参数模式和流程控制。最常被问的是IN、OUT、INOUT的区别IN只能传入OUT只能传出INOUT既能读也能改。写实验报告时这个结论可以直接放在第6关的分析里。实验12里的RBAC设计则是另一条线。文件夹里有rbac.mwbMySQL Workbench建模文件、ersolution.jpg和ersolution.drawio同时还有3.sql和2.txt。你如果要用这份资源我建议先把ersolution.drawio用draw.io打开看ER图再对照rbac.mwb看物理模型。RBAC的两个核心表是用户-角色关联表和角色-权限关联表所有业务查询最终都在校验“角色-操作-资源”三元组。很多同学卡在“怎么从ER图转成关系模式”资源里的3.sql就是最终答案可以直接用来建库也可以反推设计过程。2.3 快速整体导入写一个批处理把实验SQL全部跑起来如果你想在本地快速复现整个实验链不需要一个个文件手动执行。我习惯在Windows下先写一个批处理脚本把每个实验目录下的SQL文件按顺序导入。这里是一个示例echo off set DB_NAMEdb_principle_test set MYSQL_BINC:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe set ROOT_PWDyourpassword %MYSQL_BIN% -u root -p%ROOT_PWD% --default-character-setutf8 -e DROP DATABASE IF EXISTS %DB_NAME%; CREATE DATABASE %DB_NAME% CHARACTER SET utf8mb4; for /d %%i in (*) do ( if exist %%i\*.sql ( echo importing [%%i]... cd %%i for %%f in (*.sql) do ( %MYSQL_BIN% -u root -p%ROOT_PWD% --default-character-setutf8 %DB_NAME% %%f ) cd .. ) )脚本的思路是先删除并重建一个干净的测试库然后遍历当前目录下的所有文件夹进入每个文件夹后按文件名顺序导入所有SQL文件。为什么要先DROP DATABASE因为实验1-4的建表语句很多用了CREATE TABLE如果库已经存在同名表第二次跑会直接报错。这个脚本在编码上做了强制utf8避免中文字段名和注释乱码。实际执行时MYSQL_BIN路径要改成你自己的安装路径另外注意有些实验文件夹里包含非SQL的文件如标签.txtif exist %%i\*.sql这个判断就是为了跳过那些没有SQL的目录。这里有个小细节for %%f in (*.sql)会按文件名的字典序导入而文件名是1.sql、10.sql、11.sql这样的字符串所以导入顺序是1、10、11...而不是1、2、3。好在大部分实验文件之间没有强依赖但如果某个实验里后面的文件需要前面的结果建议手工把文件重命名为01.sql、02.sql这样补位。资源包里实验3的查询文件达到19个这种补位就能避免顺序错乱。3. 在Windows环境跑通数据访问实验从SQL脚本到JDBC连接关键词是Windows所以这一章专门关心Windows下的实操。很多同学用Linux服务器做MySQL实验但本地机是Windows这份资源包里的shell脚本实验11的备份恢复就涉及路径分隔符和编码问题需要调整为bash环境。在Windows上最稳妥的做法是装一个MySQL Community Server然后用命令行工具或MySQL Workbench执行SQL。3.1 环境准备Windows下的MySQL安装与字符集坑安装MySQL时选“Developer Default”会导致配置文件默认监听3306还会自动安装Workbench和Shell。如果只是想跑这份实践我一般选“Server only”这样更轻量。装完后需要确认服务已启动net start MySQL80如果服务名不对用services.msc打开服务管理器查看实际的MySQL服务名称。接着在PowerShell里登录mysql -u root -p --default-character-setutf8为什么要加--default-character-setutf8因为实验资源包里的SQL脚本都是UTF-8编码MySQL客户端在Windows默认的字符集是gbk两种编码不一致时中文字符串会显示成乱码甚至报“Incorrect string value”。登录后先看当前字符集SHOW VARIABLES LIKE character_set_%;正常时character_set_client和character_set_connection应为utf8。如果确实出现了乱码可以在每个会话开始前执行SET NAMES utf8mb4;它同时改变客户端、连接和结果集的字符集。3.2 复现存储过程、触发器与事务隔离级别在环境就绪后按实验6和实验7的顺序做一次完整复现。以触发器为例资源包里的实验7通常要求你写一个BEFORE INSERT触发器来保证某字段的合法性。你可以这样在测试库里直接试USE db_principle_test; DELIMITER $$ CREATE TRIGGER trg_before_insert_student BEFORE INSERT ON student FOR EACH ROW BEGIN IF NEW.gender NOT IN (M,F) THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT gender must be M or F; END IF; END$$ DELIMITER ;这个触发器的BEFORE INSERT表示在插入动作之前触发FOR EACH ROW说明行级触发NEW.gender指向新插入行的gender字段。一旦值不是M或FSIGNAL就会抛错并终止插入。用这个能直观看到数据库完整性约束在应用层之外还多了一道保护。执行时如果看到“Trigger already exists”的报错先执行DROP TRIGGER IF EXISTS trg_before_insert_student;再重新创建。实验10的并发控制与隔离级别需要开两个MySQL会话来模拟。常见做法是窗口A开启事务并update一行保持不提交窗口B用SELECT看能不能读到改变后的值。如果B读到了说明当前隔离级别是READ UNCOMMITTED大多数MySQL默认是REPEATABLE READB读到的还是旧值。你可以用下面的SQL确认当前隔离级别SELECT transaction_isolation;然后根据实验文档要求用SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;来切换不同级别再重复刚才的观察。这一步能同时验证脏读、不可重复读和幻读的定义。实验13的Java篇在Windows下的坑集中在JDBC连接字符串。资源包里的6个Java文件核心是DriverManager.getConnection的写法String url jdbc:mysql://localhost:3306/db_principle?useSSLfalseserverTimezoneUTCcharacterEncodingutf8; Connection conn DriverManager.getConnection(url, root, password);这里的useSSLfalse在本地开发时大多能去掉SSL握手开销serverTimezoneUTC是为了避免时区报错characterEncodingutf8配合数据库字符集使用。如果是在较新版本的MySQL连接器下运行不带这三个参数时经常出现“Unknown timezone”或“CLIENT_PLUGIN_AUTH”相关的报错。3.3 备份与日志把bash脚本改成Windows可执行版本实验11里的备份脚本是1_1.sh、2_1.sh这类bash文件在Linux或Git Bash下可以直接运行但在Windows原生CMD/PowerShell里会报错。我踩过一次坑后来习惯先看脚本内容再决定怎么改写。典型的bash备份脚本长这样#!/bin/bash mysqldump -u root -p --default-character-setutf8 --single-transaction db_principle_test backup_$(date %Y%m%d_%H%M%S).sql这条命令的意思是用mysqldump做逻辑备份开启--single-transaction避免锁表备份文件名带上时间戳。在Windows的PowerShell里$(date ...)语法不认重定向也可能产生UTF-16编码问题。我改成这样$timestamp Get-Date -Format yyyyMMdd_HHmmss mysqldump -u root -p --default-character-setutf8 --single-transaction db_principle_test backup_$timestamp.sql在PowerShell里执行时输出重定向还会产生UTF-16编码导致备份文件带BOM。更保险的做法是用chcp 65001切换代码页但备份文件最好用--result-file参数让mysqldump自己写文件不经过Shell重定向mysqldump -u root -p --default-character-setutf8 --single-transaction --result-filebackup_$timestamp.sql db_principle_test--result-file是mysqldump的原生参数直接在当前工作目录写文件避免Windows管道的编码干扰。如果你不想改写脚本另一个更省事的方案是安装Git Bash把实验11的.sh文件直接拖进Git Bash里跑但前提是mysqldump已经加入PATH。我在Windows下一般把MySQL安装目录的bin路径手动加进系统环境变量这样不管在CMD、PowerShell还是Git Bash里都能直接调用。4. 避坑指南三次翻车后总结的五个失败点在复现过程中遇到过好几类问题单独拿出来说。这里只挑最常见的五条每条都按现象→原因→解决的结构来写基本能覆盖Windows环境下的主要雷区。4.1 编码SQL文件在命令行执行时报“Incorrect string value”现象直接用source E:/实验包/1.sql导入时包含中文INSERT语句的脚本报“Incorrect string value: \xE5\x93... for column name at row 1”。原因命令行客户端以GBK回显和传送字符集而SQL文件是UTF-8编码。客户端把字节流按GBK解释后传给服务器服务器再做UTF-8转码时发现非法字节序列。解决一条命令避免这个坑在登录MySQL时指定字符集mysql -u root -p --default-character-setutf8如果已经是登录状态执行SET NAMES utf8mb4;临时改会话。注意utf8mb4才是真正的四字节编码utf8在MySQL里最多三字节遇到emoji字符就会翻车。提示SQL文件本身的编码也要检查。用记事本另存为时默认UTF-8带BOM当BOM被当作数据读入时第一个CREATE语句前会有一个不可见字符导致语法错误。建议用编辑器把文件格式改为UTF-8无BOM再执行。4.2 权限存储过程和触发器创建成功后调用权限不足现象实验6创建的存储过程用普通用户调用时报“PROCEDURE sp_demo does not exist”或“execute command denied to user studentlocalhost”。原因虽然CREATE PROCEDURE成功但默认的存储过程权限是EXECUTE而且很多MySQL安装默认只给root分配了CREATE ROUTINE和ALTER ROUTINE权限普通用户没有EXECUTE权限。触发器也是一样涉及表的所有者才能设置。解决用root登录后显式授权GRANT EXECUTE ON PROCEDURE db_principle_test.sp_fund_sales_summary TO studentlocalhost; FLUSH PRIVILEGES;如果是触发器权限不足直接给该用户授予TRIGGER权限GRANT TRIGGER ON db_principle_test.* TO studentlocalhost;。另外注意存储过程创建时的DEFINER如果指定了某个不存在的用户也会导致后续调用时找不到底层对象建议统一用root作为DEFINER。4.3 隔离级别实验两个终端里看到的现象一直重复无法区分现象实验10的脏读测试开着两个命令行窗口窗口B无论如何都读不到窗口A的未提交修改和文档描述的READ UNCOMMITTED表现相反。原因MySQL默认的隔离级别是REPEATABLE READ在InnoDB引擎下快照读不会读尚未提交的数据。实验文档里给的READ UNCOMMITTED需要先在会话中设置而很多人写在my.ini里全局改改完没有重启服务。解决在窗口A和窗口B都先设置隔离级别再开事务SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; START TRANSACTION; UPDATE student SET name 测试 WHERE id 1; -- 此时不要提交在B窗口执行SELECT name FROM student WHERE id 1;如果你希望实验现象更明显把测试表改成InnoDB引擎不要用MyISAM。MyISAM不支持行级锁和事务也根本不会出现脏读、不可重复读等表现实验现象全无意义。4.4 B树C代码Windows下编译失败现象实验14的b_plus_tree.cpp在Visual Studio里编译报错典型错误是“无法打开源文件sys/mman.h”或“strdup不是std的成员”。原因这份代码是按POSIX接口写的Windows的原生API没有mmap也没有unistd.h。实验包里的源码大概率是从Linux环境迁移过来没有适配Windows。解决我采用的办法是装一个MinGW-w64配置好g后使用C17标准编译。如果仍然报mmap缺失直接把b_plus_tree_page.cpp里的内存映射部分替换成普通new分配。更轻量的方案是在Windows上跑WSL直接编译运行。如果只能留在Windows环境建议把实验目标定为“读懂代码并修改核心逻辑”而不是完全跑通因为助教通常看的是你对页面分裂和删除合并逻辑的理解。4.5 JDBC连接Java代码报“Public Key Retrieval is not allowed”现象实验13的1.java用了默认JDBC URL运行时抛出Public Key Retrieval is not allowed。原因MySQL 8.0默认使用caching_sha2_password认证插件。如果不提供安全连接驱动要求允许公钥检索来加密密码而默认连接配置不允许。解决在URL末尾加allowPublicKeyRetrievaltrue即可。String url jdbc:mysql://localhost:3306/db_principle?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneUTC;如果还需要继续操作我的习惯是同时把useSSL和allowPublicKeyRetrieval两个参数固定下来避免在不同版本驱动之间踩坑。5. 把B树源码当调试工具验证索引维护逻辑的一个实用技巧实验14是整个资源包最硬核的部分。如果你已经跑通了前面的SQL实验接下来可以试着把精力集中在b_plus_tree.cpp和b_plus_tree_delete.cpp这两个文件上。但直接看代码很难体会B树的插入分裂和删除合并过程我建议用一个简单的测试主函数驱动整棵树再用标准库容器做结果对比。具体做法是先构造一棵最小B树扇出fanout设置成3顺序插入从1到20的整数键。每插入若干个键就调用一次树的print_tree()方法。有的源码里没有打印函数可以自己在页面类里写一个递归遍历叶子节点并输出键值列表的方法。验证步骤如下BPlusTreeint, int tree(3); for (int i 1; i 20; i) { tree.insert(i, i * 10); if (i % 5 0) { std::cout After insert i :\n; tree.print_tree(); } } std::vectorint keys; tree.collect_all_keys(keys); assert(keys.size() 20); assert(std::is_sorted(keys.begin(), keys.end()));这里tree(3)里的3是内部节点最多可以容纳的键数量这决定了分裂阈值。collect_all_keys是我在测试时额外写的一个遍历方法把所有叶子节点里的键按序收集到一个vector中。如果顺序不对或数量不对说明分裂或者指针链接有bug。删除侧的调试更简单每删除一个键就检查一次叶子节点的占用率。B树删除合并的逻辑经常出错点在于当邻居节点可以借用时要更新父节点的分隔键当必须合并时父节点的键数量会减一。你可以把删除1到20的过程倒序执行然后每删一次打印根节点和叶子节点的键数量。如果根节点键数量变成0说明树高正在下降这一行为是删除合并成功后的正常现象。这个调试习惯对我帮助很大。从那以后我每次拿到新的索引实现都会先用这种“最小扇出顺序插入逆序删除”的方式快速验证核心逻辑是否存在低级错误而不是直接去看复杂的分裂过程。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

自定义UDP视频传输中的处理层设计:分片、重传与抖动缓冲实战解析

自定义UDP视频传输中的处理层设计:分片、重传与抖动缓冲实战解析

这活儿我干过不少次了——领导丢来一句“要做一个能在低延时下传视频的模块,网络条件不好也得凑合看”,然后你打开文档一看:不能用TCP,不能上RTSP那套,得自己定UDP协议。自定义UDP协议视频传输,听起来很自由…

📅 2026/10/9 12:45:02
SSH断开任务就死?nohup与tmux让后台任务永不掉线

SSH断开任务就死?nohup与tmux让后台任务永不掉线

很多刚接触 Linux 服务器的人应该都遇到过这个场景:本地电脑连上服务器,跑一个数据同步脚本,估摸着要十分钟,你正想合上笔记本去倒杯水,结果屏幕一锁、Wi-Fi 一断,回来一看终端里全是报错,任务没…

📅 2026/10/9 12:45:02
VS Code中高效下载Hugging Face数据集:断点续传与镜像加速实操

VS Code中高效下载Hugging Face数据集:断点续传与镜像加速实操

VS Code里折腾Hugging Face数据集下载,这几招真的很省事 很多朋友第一次接触Hugging Face,都是因为想找一个现成的开源数据集或者模型权重。模型还好说,直接用 snapshot_download 几行代码就拉下来了,数据集反而更绕——有的数据…

📅 2026/10/9 12:45:02
MORE NEWS

更多资讯

📰

英语语法术语表:用“人话”拆解句子骨架与从句逻辑

1. 为什么你需要一份语法术语表,而不是又一本语法书很多人学英语学到某个阶段会撞上一堵墙:句子里的单词都认识,但就是看不懂它在说什么。你去查语法书,书里告诉你这叫“非限制性定语从句”,你翻回目录找“定语从句”的…

📰

文件上传交互

6.5 文件上传交互文件上传是 Web 表单交互的核心场景之一,覆盖本地文件读取、预览、提交、传输的完整链路。从基础的表单上传到拖拽交互,再到大文件分片传输,形成了覆盖不同文件体积、不同体验需求的完整上传体系,是附件提交、资源…

📰

WinDbg 蓝屏调试实战:从 dump 抓取到驱动定位的完整链路

简介:这份资源是面向Windows开发与系统排障人员的Windbg调试工具详解资料包,适合具备一定C/C基础、需要处理蓝屏崩溃、驱动错误或内存异常的中高级开发者。包内共307个文件,以82个dll动态库、42个h头文件、39个exe可执行程序为主,…

📰

叮当小宝CS复盘:抖音小店客服消息回不过来?自动回复先接住咨询

做抖音小店的运营应该都有体会:视频爆的那几个小时,客服咨询是按秒往上跳的。一家做运动配饰的小店上个月有条视频进了热门,当天咨询量是平日的十倍,店主两口子从中午回复到半夜,还是有三百多条消息没顾上,…

📰

Django+requests京东比价系统实战:从爬虫到展示全链路拆解

简介:这是一套基于Python与Django框架开发的京东商品比价系统完整项目源码,面向计算机相关专业的毕业设计、课程设计及项目开发学习者,帮助解决电商价格监控与比价分析类选题的实现难题。项目采用request爬虫抓取京东商品数据,配合…

📰

Access 2007 免费版 zip 靠不靠谱?一张图看懂 accdb 与正规获取法

简介:Access 2007 免费精简版安装包,是面向办公软件场景的 Access 2007 SP3 独立精简版本,适合需要快速部署数据库环境、不愿安装完整 Office 套件的办公人员、数据库初学者或教学场景使用。该包基于官方 SP3 深度定制,重点解决了…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬