ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据库原理实验课设全集:从建库到报告,一套能跑通的完整路径

数据库原理实验课设全集:从建库到报告,一套能跑通的完整路径 简介这份资源是西南交通大学《数据库原理实验》课程的实验与课程设计全集面向软件工程、人工智能等专业正在学习数据库课程的学生以及需要完成实验报告和课程设计任务的学习者。压缩包共收录10个文件以9个SQL脚本和1份docx实验报告为主整体约1.42MBSQL文件覆盖LAB-1至LAB-6的分次实验查询练习以及课程设计相关的建库建表与综合操作脚本docx则对应实验报告的撰写参考。资源围绕ER模型、关系代数、SQL语法等核心概念展开涉及SELECT查询、INSERT、UPDATE、DELETE等基础语句也包含JOIN连接、子查询等进阶操作并延伸至数据库创建、表设计、索引建立、权限控制与性能优化等管理主题。课程设计部分要求综合运用所学解决实际数据库问题锻炼设计与实战能力。目前已有482人学习下载适合作为实验对照、报告参考与课程设计思路借鉴的辅助材料。1. 数据库原理实验课设全集从建库到报告一套能跑通的完整路径很多人做《数据库原理》实验时卡住的地方往往不是 SQL 语法本身而是不知道一个完整的实验或课程设计该长什么样。西南交大这套实验及课程设计全集核心价值在于它把「建库建表 → 数据操作 → 查询与视图 → 存储过程与触发器 → 课程设计报告」串成了一条线。你拿到的不只是几段 SQL 代码而是一个从需求分析到 E-R 图、从物理设计到测试验证的完整参照。适合正在上数据库原理课、要交实验报告或课程设计的学生也适合想系统梳理 SQL 实战的开发者。下面我按实际做一遍的顺序把每一步拆开讲清楚。2. 实验环境搭建与建库建表SQL Server 和 MySQL 两条路怎么选2.1 先定数据库平台再谈代码能不能跑数据库原理实验最常见的平台是 SQL Server 和 MySQL。标题里没有指定具体版本但从热搜词看SQL Server 2008 R2、2012、2016、2019、2022 都有人问MySQL 也是课程设计的高频选择。我的建议是如果学校机房统一用 SQL Server就跟着用 SQL Server如果是自己电脑做课程设计MySQL 8.x 更省心安装体积小、社区资料多。选型上有一个容易被忽略的点SQL Server 的 T-SQL 和 MySQL 的 SQL 方言在存储过程、触发器、自增列、日期函数上差异不小。比如自增列SQL Server 用IDENTITY(1,1)MySQL 用AUTO_INCREMENT字符串拼接 SQL Server 用MySQL 用CONCAT()。所以一旦选定平台后续所有代码都要保持同一套方言不要混着抄。安装环节的坑集中在 SQL Server。常见问题是安装时提示对密钥无访问权限或者装完连不上实例。前者通常是安装账户权限不足用管理员身份运行安装程序即可后者检查 SQL Server 配置管理器里 TCP/IP 协议是否启用以及防火墙是否放行 1433 端口。MySQL 这边相对简单装完记得把bin目录加入环境变量否则命令行敲mysql会提示找不到命令。提示如果只是做课程设计不必追求最新版本。SQL Server 2019 或 MySQL 8.0 足够覆盖数据库原理实验的全部知识点版本太新反而可能遇到教材代码不兼容。2.2 建库建表的最小可运行脚本下面这段脚本以 MySQL 为例建一个「学生选课」库和三张核心表。这个结构是数据库原理实验里出现频率最高的场景几乎每套课设都绕不开。-- 创建数据库指定字符集避免中文乱码 CREATE DATABASE student_course DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE student_course; -- 学生表学号为主键姓名非空 CREATE TABLE student ( sno CHAR(10) PRIMARY KEY, sname VARCHAR(20) NOT NULL, ssex CHAR(2) DEFAULT 男, sage INT CHECK (sage BETWEEN 15 AND 60), sdept VARCHAR(30) ); -- 课程表课程号为主键 CREATE TABLE course ( cno CHAR(6) PRIMARY KEY, cname VARCHAR(40) NOT NULL, credit DECIMAL(3,1) CHECK (credit 0), cpno CHAR(6), FOREIGN KEY (cpno) REFERENCES course(cno) ); -- 选课表联合主键成绩允许为空表示未录入 CREATE TABLE sc ( sno CHAR(10), cno CHAR(6), grade DECIMAL(4,1) CHECK (grade BETWEEN 0 AND 100), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );逻辑说明student表用CHAR(10)存学号固定长度比VARCHAR在索引上更稳定sage加了CHECK约束防止录入明显不合理的年龄course表的cpno是自引用外键表示先修课这是教材里讲参照完整性时的经典例子sc表用(sno, cno)联合主键天然保证一个学生同一门课只选一次。参数说明utf8mb4是必须的否则中文姓名和课程名可能变成问号DECIMAL(4,1)表示总共 4 位、小数点后 1 位成绩 100.0 刚好放得下外键约束在插入数据时要注意顺序先插student和course再插sc否则会报外键冲突。如果换成 SQL Server把AUTO_INCREMENT相关写法去掉CHAR和VARCHAR基本通用但CHECK约束的写法一致。建表完成后用SELECT * FROM student;验证表结构空表返回 0 行就说明建成功了。3. 数据操作与查询实验把增删改查和复杂查询一次跑透3.1 插入测试数据的顺序和批量写法数据插入看起来简单但实验报告里经常因为顺序错误导致外键报错。正确顺序是先student再course最后sc。下面给出一批可直接执行的测试数据。-- 先插学生 INSERT INTO student VALUES (2021001, 张三, 男, 20, 计算机), (2021002, 李四, 女, 19, 软件工程), (2021003, 王五, 男, 21, 计算机), (2021004, 赵六, 女, 20, 网络工程); -- 再插课程注意先修课要先存在 INSERT INTO course VALUES (C001, 数据库原理, 4.0, NULL), (C002, 数据结构, 4.0, NULL), (C003, 操作系统, 3.5, C002), (C004, 计算机网络, 3.0, NULL); -- 最后插选课记录 INSERT INTO sc VALUES (2021001, C001, 88.5), (2021001, C002, 76.0), (2021002, C001, 92.0), (2021003, C001, 55.0), (2021003, C003, 61.5), (2021004, C004, NULL);逻辑说明course表里C003的先修课是C002所以C002必须先插入否则外键约束会拒绝。sc表最后一条grade为NULL表示选了课但成绩还没出这个设计在后续查询里会用到。参数说明批量INSERT时值列表用逗号分隔最后一条后面不要多写逗号这是新手最常见的语法错误。如果某条插入失败整个批量语句会回滚所以建议先小批量测试。3.2 从单表查询到多表连接实验报告的核心得分点数据库原理实验的查询部分通常要求覆盖条件查询、排序、聚合、分组、连接、子查询。下面用几个典型例子串起来。-- 1. 查询计算机系年龄大于20的学生 SELECT sno, sname, sage FROM student WHERE sdept 计算机 AND sage 20 ORDER BY sage DESC; -- 2. 统计每门课的选课人数和平均分 SELECT c.cno, c.cname, COUNT(sc.sno) AS 选课人数, ROUND(AVG(sc.grade), 1) AS 平均分 FROM course c LEFT JOIN sc ON c.cno sc.cno GROUP BY c.cno, c.cname; -- 3. 查询没有成绩的选课记录对应的学生和课程 SELECT s.sname, c.cname FROM sc JOIN student s ON sc.sno s.sno JOIN course c ON sc.cno c.cno WHERE sc.grade IS NULL; -- 4. 子查询查询选了数据库原理的学生 SELECT sno, sname FROM student WHERE sno IN ( SELECT sc.sno FROM sc JOIN course c ON sc.cno c.cno WHERE c.cname 数据库原理 );逻辑说明第 2 个查询用LEFT JOIN而不是INNER JOIN是为了让没有学生选的课程也能出现在结果里选课人数显示 0。这是实验报告里体现「考虑边界情况」的加分项。第 3 个查询用IS NULL而不是 NULL因为 SQL 里NULL不能用等号比较。第 4 个查询用子查询实现也可以改写成连接两种写法在实验报告里都可以写但要注意子查询返回多行时用IN而不是。参数说明ROUND(AVG(grade), 1)保留一位小数避免平均分出现一长串小数位GROUP BY后面必须包含所有非聚合列否则在严格模式下会报错。如果查询结果为空先检查WHERE条件里的字符串是否和插入数据完全一致包括大小写和空格。注意SQL Server 里字符串比较默认不区分大小写MySQL 默认也不区分但如果建库时选了_bin排序规则就会区分。实验报告里如果出现「查不到数据」先排查这个。4. 视图、存储过程与触发器实验里最容易翻车的三个对象4.1 视图不是表别拿它当表改视图在实验里通常要求「创建一个视图然后基于视图查询」。视图本身不存数据它只是一条被保存的查询语句。下面创建一个学生成绩视图。CREATE VIEW v_student_grade AS SELECT s.sno, s.sname, c.cname, sc.grade FROM student s JOIN sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno; -- 查询视图 SELECT * FROM v_student_grade WHERE grade 60;逻辑说明视图把三张表的连接封装起来后续查询只需要面对一个「宽表」。但要注意如果视图定义里包含聚合函数、DISTINCT、GROUP BY这个视图通常是只读的不能直接INSERT或UPDATE。实验报告里如果要求「通过视图修改数据」一定要确认视图是否可更新。参数说明视图名建议用v_前缀和物理表区分开。创建视图后可以用SHOW CREATE VIEW v_student_grade;查看定义确认没有语法问题。4.2 存储过程参数传错是最高频的翻车点存储过程在数据库原理实验里通常要求「创建一个带参数的存储过程实现某个业务逻辑」。下面这个例子根据学号查询该学生的选课和平均分。DELIMITER // CREATE PROCEDURE p_get_student_avg(IN p_sno CHAR(10)) BEGIN SELECT s.sname, COUNT(sc.cno) AS 选课数, IFNULL(ROUND(AVG(sc.grade), 1), 0) AS 平均分 FROM student s LEFT JOIN sc ON s.sno sc.sno WHERE s.sno p_sno GROUP BY s.sno, s.sname; END // DELIMITER ; -- 调用 CALL p_get_student_avg(2021001);逻辑说明DELIMITER //是为了让 MySQL 把整个存储过程体当成一个语句否则遇到第一个分号就截断了。IFNULL处理没有选课记录时平均分为NULL的情况返回 0 更友好。LEFT JOIN保证即使学生没选课也能返回一行。参数说明IN表示输入参数存储过程还支持OUT和INOUT。如果调用后没有结果先检查参数值是否和表里数据匹配再检查WHERE条件是否写错。SQL Server 的存储过程写法不同用CREATE PROCEDURE ... AS BEGIN ... END调用用EXEC。4.3 触发器改一张表另一张表跟着动触发器实验通常要求「在选课表插入记录时自动更新某个统计表」。下面用触发器实现当sc表插入一条成绩时如果成绩低于 60往预警表里写一条记录。-- 先建预警表 CREATE TABLE grade_warning ( id INT AUTO_INCREMENT PRIMARY KEY, sno CHAR(10), cno CHAR(6), grade DECIMAL(4,1), warn_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 创建触发器 DELIMITER // CREATE TRIGGER trg_grade_warning AFTER INSERT ON sc FOR EACH ROW BEGIN IF NEW.grade 60 THEN INSERT INTO grade_warning(sno, cno, grade) VALUES (NEW.sno, NEW.cno, NEW.grade); END IF; END // DELIMITER ;逻辑说明AFTER INSERT表示插入完成后触发FOR EACH ROW表示每插入一行执行一次。NEW.grade引用刚插入的那行数据。如果成绩为NULLNEW.grade 60结果为NULL不会进入IF分支这是符合预期的。参数说明触发器里不要写SELECT返回结果集否则在某些客户端里会报错。触发器逻辑尽量简单复杂业务逻辑放在应用层或存储过程里。如果插入数据后预警表没有记录先检查触发器是否创建成功用SHOW TRIGGERS;查看。5. 课程设计报告与 SQL 代码组织避坑与排查清单5.1 报告结构别照搬模板按「需求→设计→实现→测试」走课程设计报告最常见的毛病是「代码堆砌没有设计过程」。老师要看的是你怎么从需求推导出 E-R 图再从 E-R 图转换成关系模式最后才是建表和查询。我的建议是报告按四块写需求分析要解决什么问题、概念设计E-R 图、逻辑设计关系模式 范式说明、物理实现建表 SQL 测试数据 关键查询。每块之间要有推导关系不要各写各的。E-R 图用 Visio 或 draw.io 画实体用矩形、属性用椭圆、联系用菱形。关系模式写清楚主键和外键比如student(sno, sname, ssex, sage, sdept)主键下划线标注。范式说明不用长篇大论点明每张表满足第几范式、为什么这样拆分即可。5.2 避坑清单五个高频翻车现场现象一建表时外键报错提示「Cannot add foreign key constraint」。原因通常是两张表的字段类型不一致比如一张用CHAR(10)另一张用VARCHAR(10)或者字符集不同。解决方法是把外键字段的类型、字符集、排序规则改成和主表完全一致。现象二插入中文显示为问号。原因是建库或建表时没有指定utf8mb4。解决方法是建库时显式指定字符集已经建好的表可以用ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4;修改。现象三存储过程创建后调用报「Procedure does not exist」。原因通常是DELIMITER没有改回来或者创建时中间有语法错误导致整个语句没执行成功。解决方法是先DROP PROCEDURE IF EXISTS再重新创建创建后确认没有报错信息。现象四查询结果比预期少。最常见的原因是WHERE条件里用了比较NULL或者多表连接时用了INNER JOIN把没有匹配的行过滤掉了。解决方法是把 NULL改成IS NULL把INNER JOIN改成LEFT JOIN看是否数据变多。现象五课程设计代码在别人电脑上跑不起来。原因是数据库版本或方言不同。解决方法是在 SQL 文件开头注释写明数据库类型和版本建库语句加上IF NOT EXISTS避免重复执行报错。提示实验报告里的 SQL 代码建议按功能分文件存放比如01_create.sql、02_insert.sql、03_query.sql、04_procedure.sql这样别人复现时按顺序执行即可不用在一大段代码里找。6. 把实验代码变成可复用的课程设计模板一个具体技巧做完一遍实验后最有价值的动作是把代码整理成可复用的模板。我的习惯是建一个db_course_template目录里面放四个文件schema.sql负责建库建表data.sql负责测试数据queries.sql放所有查询objects.sql放视图、存储过程、触发器。每个文件开头写清楚依赖顺序和执行方式。# 按顺序执行避免外键和依赖问题 mysql -u root -p schema.sql mysql -u root -p student_course data.sql mysql -u root -p student_course objects.sql mysql -u root -p student_course queries.sql这样整理的好处是下次遇到类似的课程设计只需要改schema.sql里的表结构和data.sql里的数据查询和对象部分可以复用大部分。另一个技巧是在queries.sql里给每个查询加上注释编号和实验报告里的题号对应老师检查时一目了然。验证模板是否可复用的方法很简单把四个文件在一个全新的数据库实例上按顺序跑一遍如果没有任何报错并且查询结果和报告里一致就说明模板是干净的。我自己的血泪经验是第一次整理时偷懒没写DROP TABLE IF EXISTS结果第二次执行时因为表已存在直接报错后来在每个建表语句前都加上DROP TABLE IF EXISTS虽然粗暴但省去了很多后悔药。最后一个习惯每次做完实验把遇到的报错信息和解决方法记在一个issues.md里。数据库原理实验的报错来来去去就那几类记一次下次直接查比重新搜快得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表