数据库原理实验报告怎么写?从建表到触发器完整实操指南

📅 发布时间:2026/10/9 18:32:34
数据库原理实验报告怎么写?从建表到触发器完整实操指南
简介这是南华大学《数据库原理》课程实验报告的完整文档面向该校大数据技术等专业正修读数据库原理、需要对照实验要求完成作业或复习SQL查询的同学。报告以SQL Server Management Studio为环境依次覆盖四个实验认识DBMS并用图形界面及SQL语句创建数据库和表定义主码、外码、默认值等完整性约束建立学生-课程-选课表间的一对多、多对多关系随后进行单表查询、多表连接查询、高级查询与数据更新操作包含按姓名、成绩、出生日期筛选条件以及JOIN、GROUP BY、ORDER BY等常见写法。实验代码与运行结果均已整理在doc文档中可帮助读者快速定位关键语句、理解查询执行结果也便于拓展练习。压缩包共1个文件doc格式大小5.38MB查阅方便。该资源已有375人学习适合作为实验报告撰写、SQL查询练习和期末复习的参考。1. 南华大学数据库原理实验报告一份能落地的思路不是一份模板搜这个标题的人多半不是要找一份现成的文档抄而是想知道数据库原理这门课的实验报告到底该怎么写、实验怎么做才能不翻车。数据库原理实验报告和其他课有个最大的区别它不看你抄了多少而是看你的库设计有没有道理、SQL是不是真在数据库里跑过、实验结果能不能解释得通。我见过太多人把报告写得像一篇名词解释结果一问三不知或者发来一张连约束都建不上去的截图这种报告交上去自己心里也没底。这份内容想帮你解决的只有三件事一是理清楚一个数据库实验该按什么顺序做才不会返工二是把常用的建库、查询、权限、视图、触发器这些东西讲成可以直接照做的步骤三是把那些只有踩过坑才知道的细节提前告诉你。适合正在上课要交实验报告的人也适合把实验报告当成项目练手的人。方向是通用的后面都用一套具体的案例来讲你换自己的题目也能套。2. 动手前先想清楚这个库要装什么数据实验报告才能站得住很多人的实验报告看起来单薄不是因为写得少而是因为库太假。几张表各三五条数据查询随便一跑就出结果图倒是画得漂亮但老师一问“你这个查询为什么要连三张表”就答不上来。反过来你要是把数据量和表关系设计得合理哪怕报告写得朴素别人看一眼也知道你是真做过。2.1 用一个「学籍-选课-成绩」的案例把表关系一次理清常见的做法是用“学生-课程”这套最经典的教学场景因为它的关系刚好覆盖数据库原理课里要求的所有重点实体完整性主键、参照完整性外键、用户自定义完整性约束、多对多关系分解。我一般建议别自己拍脑袋造一个“图书管理系统”或者“超市系统”选这种大家都熟悉、但要认真做也做得出深度的场景后面每一条实验要求都能对得上。你需要设计至少五张表学生表学号、姓名、性别、出生日期、所在系、课程表课程号、课程名、学分、授课教师工号、选课表学号、课程号、成绩、班级表班级号、班级名、专业、教师表教师工号、姓名、职称。这里最核心的技巧不是表多而是把选课表设计成连接实体让它同时持有学生表的主键和课程表的主键这样多对多就拆成了两个一对多。建表语句建议用完整形态写出来约束条件全带上。CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, Sname VARCHAR(20) NOT NULL, Ssex CHAR(2) DEFAULT 男 CHECK (Ssex IN (男, 女)), Sbirth DATE, Sdept VARCHAR(30) ); CREATE TABLE Course ( Cno CHAR(6) PRIMARY KEY, Cname VARCHAR(40) NOT NULL, Credit SMALLINT CHECK (Credit 0 AND Credit 10), Tno CHAR(6) NOT NULL ); CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(6) NOT NULL, Grade DECIMAL(5,2), PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );代码里的 CHECK 和 FOREIGN KEY 是关键别只是为了“看起来规范”而写它们会在后续做数据完整性实验时真正起作用。Sno 用 CHAR(10) 是因为学号是定长字符串用 VARCHAR 反而会在比较时因为隐式转换出问题Grade 用 DECIMAL(5,2) 是为了精确存储两位小数不允许“及格但算不出来”的情况。2.2 插入数据也有讲究数据量过小查询结果没说服力建完表之后第一件事不是写查询而是把数据喂够。我有个经验值学生表至少 12 条以上覆盖至少两个系课程表 6 门以上选课表 40 条以上。为什么强调这个量级因为你的很多查询要靠条件过滤出“部分行”如果每张表就 3 条数据select 一下全出来了后面分组、排序、聚合函数的表现力全打折扣。插入的时候注意两点。一是先插父表再插子表也就是先插学生和课程再插选课顺序反了外键检查会直接报错。二是刻意留几处设计好的“坑”来给后面的查询制造冲突比如某个学生选了课但没成绩某个教师没有课这正好让外连接查询有意义。INSERT INTO Student VALUES (2024010101, 张伟, 男, 2005-03-12, 计算机系); INSERT INTO Student VALUES (2024020202, 李娜, 女, 2006-07-25, 外语系); INSERT INTO Course VALUES (C001, 数据库原理, 4, T001); INSERT INTO SC VALUES (2024010101, C001, 91.5); INSERT INTO SC VALUES (2024020202, C001, NULL);注意最后一条 SC 记录的 Grade 故意是 NULL这就是你实验报告里讲“空值处理”的素材。插入完成后立刻跑一条统计语句确认行数别等到写报告了才发现数据没插全那会连实验步骤都对应不上。3. 把实验拆成四段推进从建库到查询每段都有可检查的产出数据库原理实验报告最忌讳的就是把建库、查询、视图、权限全拆成孤立的章节好像每个实验是独立的。实际上它们是一条链先有库和表再灌数据然后做查询分析最后做安全控制和视图。按这个顺序来每个实验都在上一个实验的成果上加工写报告的时候前后呼应也让整个思路更连贯。3.1 第一段数据库与表的定义和修改重点是能展示“操作前-操作后”这一段只要你照着 SQL 语句敲就行但报告里要放操作前后的表结构截图或描述不只是贴语句。用 ALTER TABLE 改结构、用 DROP 删除列这些都是必考动作。ALTER TABLE Student ADD Sphone VARCHAR(11); ALTER TABLE Student MODIFY Sdept VARCHAR(50); CREATE INDEX idx_sc_cno ON SC(Cno);ALTER 语句执行后用 DESC Student 看一下表结构变化这一步是报告里体现“实验过程”最好的地方。索引创建的指向是 SC 表的 Cno 字段原理是加速按课程号查选课记录的速度索引不是越多越好太多会导致增删改变慢但实验报告里建一个就够了。3.2 第二段单表查询与聚合这是实验报告的核心篇幅单表查询占的报告篇幅通常最多因为它的变体多条件查询、模糊查询、范围查询、排序、聚合、分组、去重、空值判断。每一类都对应一个知识点最好一条一条地写。SELECT Sno, Sname, Sdept FROM Student WHERE Sdept 计算机系 ORDER BY Sno; SELECT Cno, AVG(Grade) AS avg_grade, COUNT(*) AS stu_count FROM SC GROUP BY Cno HAVING AVG(Grade) 75; SELECT Sname, Sdept FROM Student WHERE Sname LIKE 李% AND Sbirth 2005-01-01;这段代码要解释的点有两个。一个是 WHERE 和 HAVING 的分工WHERE 过滤的是分组前的行HAVING 过滤的是分组后的组这个区别是数据库原理实验报告里的高频考点。另一个是 LIKE ‘李%’ 表达的是“以李开头的所有姓名”% 是任意长度通配符这个查询能跑出结果也要能在报告里说明白为什么用 LIKE 而不是用 。3.3 第三段多表连接与嵌套查询故意制造一个“让子查询有意义”的场景多表连接是很多人的心理关卡一看到三张表 JOIN 在一起就发怵。其实只要记住一件事——JOIN 的条件一定是两张表之间的外键关系选课表连接学生表用 Sno连接课程表用 Cno就能顺下来。为了写嵌套查询我需要一个“查出成绩比某个学生高的学生名单”这种有点绕的场景。SELECT s1.Sname, s1.Sdept FROM Student s1 WHERE s1.Sno IN ( SELECT s2.Sno FROM SC sc2 WHERE sc2.Grade ( SELECT Grade FROM SC WHERE Sno 2024010101 AND Cno C001 ) );这个三层子查询的意义在于展示相关子查询和非相关子查询的区别。中间那层 sc2 引用了外层 s1 的 Sno这就是相关子查询数据库会对每个外层行重新执行一次内层查询如果你是第一次写这种嵌套建议先在子查询内部用 SELECT * 跑通再套外层不然报错都不知道错在哪。报告里写出每一步子查询返回什么结果集这一段就是全篇最扎实的部分。3.4 第四段视图、索引与安全性控制做完这一段整个实验才完整视图部分别只写“创建视图然后 SELECT”要展示视图对应用层的意义封装复杂查询让外部用户只看到授权范围内的数据。CREATE VIEW v_student_grade AS SELECT s.Sno, s.Sname, c.Cname, sc.Grade FROM Student s JOIN SC sc ON s.Sno sc.Sno JOIN Course c ON c.Cno sc.Cno WHERE sc.Grade IS NOT NULL; SELECT * FROM v_student_grade;权限控制的实验要体现不同用户能看到的库不一样。创建用户 user_stu 只给 SELECT 权限再创建 user_admin 给增删改权限然后分别用这两个身份登录执行同样的语句观察谁的语句报错。CREATE USER user_stulocalhost IDENTIFIED BY 123456; GRANT SELECT ON db_school.* TO user_stulocalhost; GRANT ALL PRIVILEGES ON db_school.* TO user_adminlocalhost; REVOKE DELETE ON db_school.* FROM user_adminlocalhost;注意 REVOKE 这条它的作用是撤销权限而不是删除用户。报告里要把“授权前不能执行、授权后能执行、撤销后不能执行”的测试过程记录下来这比单纯贴语法要难得多也更能看出你理解没理解。4. 实验报告的数据设计成绩分布、边界值、异常数据都要自己做出来数据库实验报告的数据部分是区分“真做了”和“抄了模板”的最大分水岭。你设计的数据如果每一科都是 6095 分每个学生都选了所有课程那任何查询都跑不出“有趣”的结果报告也会显得特别平淡。想写出值得看的报告就要在数据里主动埋伏笔。4.1 用一段存储过程批量生成选课数据覆盖边界条件手写 40 条 INSERT 太痛苦而且容易漏。我一般会用存储过程或者直接用一段多行 INSERT 快速生成数据重点是把成绩分布覆盖到四个区间不及格 60、6069、7089、90 分以上外加 NULL 空值。这五个状态各要有若干条。INSERT INTO SC (Sno, Cno, Grade) VALUES (2024010101, C001, 55), (2024010101, C002, 82), (2024010102, C001, NULL), (2024010102, C003, 91), (2024020201, C001, 67), (2024020202, C002, 95);这么做的目的很明确后面你要做“统计每个分数段的人数”、要“查询没成绩的学生”如果数据里什么都有一条语句就能出效果。千万别把数据全设为合理值NULL 和不及格数据反而是报告里最能出彩的地方它们让 WHERE 条件、聚合函数、外连接都有用武之地。4.2 中文环境下的排序与统计细节别在报告里忽略字符集这一步我不写代码但一定要提醒数据库安装时的字符集、排序规则直接决定中文查询结果是否正确。如果你插入中文之后查出来是乱码或者 ORDER BY 排序结果不符合写字数顺序的直觉八成是建库时字符集设成了默认的 latin1而不是 utf8mb4。我在做实验的时候吃过这个亏建库语句写成CREATE DATABASE db_school DEFAULT CHARACTER SET utf8mb4;就再没乱过。实验报告里可以加一行说明“本次实验统一使用 utf8mb4 字符集”这个细节能看出你不是第一次碰数据库老师也会觉得你有工程意识。排序规则选了 utf8mb4_general_ci中文排序按拼音近似顺序实验时验证一下就好。5. 实验报告避坑指南这几件事我不希望你再撞一次写实验报告和做实验会踩的坑不一样。做实验踩的坑是语句报错写报告踩的坑是交上去被退回来。下面几条都是我看别人报告、也看自己学生报告时最常遇到的问题按“现象-原因-解决”写清楚。5.1 建表顺序不对导致外键报错还把错误截图贴进了报告现象课程表里的 Tno 引用了教师表的工号教师表还没建就先建课程表报错无法添加外键约束。有人把报错界面截图直接贴进报告“实验过程”看起来像故障现场。原因外键引用目标表必须存在。这是数据库执行顺序的规则按“先父表、后子表”来即可。解决把建表顺序调整为教师表、学生表、课程表、选课表或者先建子表但不加外键约束数据都插完再 ALTER TABLE 补外键。建议用第一种简单且不容易漏。5.2 中文数据显示为问号报告截图全废现象INSERT 里的中文成功但 SELECT 出来全是 ?? 或乱码整张截图没法用。原因数据库、表或连接的字符集不是 utf8mb4只要其中一层出问题就会乱。解决建库时指定DEFAULT CHARACTER SET utf8mb4如果你的工具是命令行连接先执行SET NAMES utf8mb4;再跑数据。连接层其实最容易被忽略Navicat 这类工具有默认编码设置命令行下没设置的话就容易翻车。5.3 GROUP BY 查询常见错误查了未分组的列现象执行SELECT Sno, Cno, AVG(Grade) FROM SC GROUP BY Cno直接报错提示 Sno 不在 GROUP BY 子句中。原因SQL 标准要求 SELECT 中的列要么在 GROUP BY 里要么被聚合函数包裹。Sno 既没分组也没聚合逻辑上无法确定取哪一行。解决改写为SELECT Cno, Sno, AVG(Grade) FROM SC GROUP BY Cno, Sno或者只保留 Cno 与聚合结果。这个坑是高频错点建议在报告里自己主动写一段“这里原计划查询每门课选课人数所以只用 Cno 和 COUNT(*)”别人看了会觉得你把语义想清楚了。5.4 删除被引用数据时出现约束冲突实验直接卡住现象想删掉一门课结果 DELETE 报外键约束冲突课程表里的 Cno 被选课表引用着。原因外键默认限制RESTRICT不允许删除仍然被引用的父表数据。解决先删选课表里对应课程的所有记录再删课程表里的记录或者在建外键时声明ON DELETE CASCADE。我建议实验报告里写第一种因为可以顺带展示“外键约束生效”这个知识点比直接级联删除有教学意义。5.5 把实验环境和实验结论混在一起写现象报告里大段写“打开软件、新建查询、输入代码”但实验结果和结论只有一句话。原因把实验报告写成了操作说明书关注点放在怎么点鼠标而不是为什么这样做。解决环境描述什么数据库软件、什么版本放实验报告开头三行内交代完后面全部聚焦在“执行结果是什么、是否符合预期、不符合的话原因是什么”。我见过最好的写法是每条实验记录后面带一行结果说明比如“返回 6 行含 NULL 成绩记录 2 行符合预期”简洁又专业。6. 把一个普通实验报告写成有工程感的作品加触发器、事务和性能分析如果你想在这个实验里拿个好成绩或者真正把数据库原理的知识变成自己的东西可以在标准实验之外加两个小动作让整份报告的层次明显不一样。一个极端实用的技巧是把关键查询加上 EXPLAIN在报告里附上执行计划的关键行讨论一下是不是走了索引。我用 EXPLAIN 检查过一次带外键表的连接查询发现全表扫描加了一个索引之后扫描行数降了一个数量级这个对比放在报告里怎么说都有说服力。另一个加分项是触发器。数据库原理课讲到触发器通常一带而过你自己动手建一个反而能展示对数据完整性的理解。下面这个触发器的功能是当有人往选课表插入成绩超过 100 分的记录时自动拦截并保证成绩上限合法。DELIMITER // CREATE TRIGGER trg_grade_check BEFORE INSERT ON SC FOR EACH ROW BEGIN IF NEW.Grade 100 OR NEW.Grade 0 THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT Grade must be between 0 and 100; END IF; END// DELIMITER ;这段触发器代码的要点是 BEFORE INSERT 时机和 SIGNAL 语句。BEFORE 表示插入动作发生之前执行所以能拦下非法数据SIGNAL 是主动抛出错误阻止 INSERT 继续执行。你在报告里写“插入 120 分时系统报错并显示提示信息”比写十行理论都管用。触发器建好之后记得测试一下插入一条 Grade120 的记录截图里要能看到报错提示。至于事务可以用一个“选课同时扣库存”的模拟场景来演示 BEGIN TRANSACTION、COMMIT、ROLLBACK 的配合。默认不写事务时一句失败不会回滚前面的语句写清楚这个差别报告里就什么都齐了。我做实验的习惯是每跑完一条语句先问自己“这个结果合理吗”不合理就先查数据再查语法而不是急着换一条语句。这个习惯让我少走很多弯路。希望帮到你。本文还有配套的精品资源点击获取