
简介这份《华科数据库实验报告》面向高校数据库课程学习者尤其是正在完成《数据库系统概论》实验环节的本科生帮助解决实验流程不熟、SQL语句书写不规范、报告结构不完整等问题。资源以doc文档形式交付压缩包内共1个文件约294KB内容按实验目的、实验原理、实验内容、实验过程与心得体会组织覆盖SQL Server 2008查询分析器使用、DDL建表与约束定义、DML增删改查、DCL授权与回收、视图操作、库函数应用以及数据库备份与恢复等核心知识点。报告按六个实验逐项展开从基本表创建与数据插入到连接查询、子查询、聚合分组再到UPDATE与DELETE、视图创建使用、GRANT与REVOKE权限管理最后实践完整备份、差异备份与日志备份策略目录层级清晰便于对照课程进度查阅。目前已有252人学习适合需要参考实验步骤、规范报告格式或复习SQL语法的读者借鉴使用。1. 华科数据库实验报告里的 SQL Server 全流程从建库到权限收口很多同学拿到“华科数据库实验报告.doc”这个题目第一反应是去搜一份现成的 Word 模板把表建好、截图贴上去就交差。但真正做过这门实验的人都知道实验报告只是壳里面要跑通的是 SQL Server 上一整套 DDL、DML、DCL 的闭环建库建表、约束索引、增删改查、视图触发器、用户权限最后还要能复现、能排错。我带过几届做数据库实验的学弟学妹翻车最多的地方从来不是 SQL 语法而是环境没装对、约束顺序写反、权限收不回来。这篇笔记就按实验报告里最常见的章节顺序把每一步该敲什么、参数怎么设、哪里容易踩坑讲清楚。适合正在做数据库实验、需要交报告或者想借这个实验把 SQL Server 基础打牢的人。2. 实验环境与建库建表把 SQL Server 装对再动手2.1 选 SQL Server 还是别的实验报告为什么绕不开它数据库实验报告里出现频率最高的就是 SQL Server原因很实际Management Studio 图形化程度高建表、画关系图、看执行计划都直观老师给的实验指导书也大多按它写。热搜里常出现 sql server 下载、sql server 安装教程、sql server 2012 密码到期、sql server 2022 express 这些词说明大家卡在环境上的时间比写 SQL 还多。我的建议是如果只是做课程实验用 SQL Server 2022 Developer 版或 Express 版就够Developer 版功能全且免费用于学习Express 版有 10GB 单库上限做实验绰绰有余。别去折腾 2000 或 2008 这种老版本密码策略和兼容性问题会让你在无关的地方浪费一整天。安装时有两个参数必须留意。第一是身份验证模式选“混合模式”并设一个 sa 密码否则后面用 JDBC 或命令行连库时会连不上。第二是实例名默认实例直接用主机名命名实例要写成主机名\实例名实验报告里如果要求写连接字符串这里写错就是零分。装完先确认 SQL Server 服务在运行再用 SSMS 连一次能连上再往下走。提示如果遇到“密码过期”提示用 Windows 身份验证登录后执行ALTER LOGIN sa WITH PASSWORD新密码;即可别急着重装。2.2 建库建表的最小可复现脚本实验报告一般会要求建一个学生选课库或图书管理库。下面这段脚本是我常用的最小骨架包含建库、建表、主键、外键、默认值和检查约束直接改表名就能用。-- 建库注意逻辑名和物理文件路径按自己机器改 CREATE DATABASE StudentCourse ON PRIMARY ( NAME StudentCourse_data, FILENAME D:\SQLData\StudentCourse_data.mdf, SIZE 10MB, MAXSIZE 200MB, FILEGROWTH 10MB ) LOG ON ( NAME StudentCourse_log, FILENAME D:\SQLData\StudentCourse_log.ldf, SIZE 5MB, MAXSIZE 100MB, FILEGROWTH 5MB ); GO USE StudentCourse; GO -- 学生表学号主键姓名非空性别限定取值 CREATE TABLE Student ( Sno CHAR(10) NOT NULL PRIMARY KEY, Sname NVARCHAR(20) NOT NULL, Ssex CHAR(2) NOT NULL CHECK (Ssex IN (男,女)), Sage INT NULL CHECK (Sage BETWEEN 15 AND 60), Sdept NVARCHAR(30) NULL ); GO -- 课程表课程号主键学分默认 2 CREATE TABLE Course ( Cno CHAR(6) NOT NULL PRIMARY KEY, Cname NVARCHAR(40) NOT NULL, Ccredit INT NOT NULL DEFAULT 2, Cpno CHAR(6) NULL ); GO -- 选课表复合主键两个外键 CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(6) NOT NULL, Grade DECIMAL(5,1) NULL CHECK (Grade BETWEEN 0 AND 100), CONSTRAINT PK_SC PRIMARY KEY (Sno, Cno), CONSTRAINT FK_SC_Student FOREIGN KEY (Sno) REFERENCES Student(Sno), CONSTRAINT FK_SC_Course FOREIGN KEY (Cno) REFERENCES Course(Cno) ); GO这段脚本的逻辑顺序不能乱先建库再USE先建被引用的表再建引用表否则外键会报“引用的表不存在”。参数上CHAR适合定长编码如学号NVARCHAR适合中文姓名DECIMAL(5,1)表示总共 5 位、小数 1 位成绩 100.0 刚好放得下。FILEGROWTH设 10MB 是防止日志文件一次涨太多实验机上够用。如果老师要求画 E-R 图建完表在 SSMS 里右键“数据库关系图”就能自动生成比手画省事。2.3 约束和索引实验报告里最容易丢分的地方约束是实验报告评分点最密集的区域。主键、外键、唯一、检查、默认这五类至少要各出现一次。上面脚本已经覆盖了主键、外键、检查、默认唯一约束可以加在Student.Sname上做演示但注意真实场景姓名可重复实验里加完记得在报告里说明这是为演示而设。索引方面实验通常要求对经常查询的列建非聚簇索引比如SC.Grade或Student.Sdept。-- 唯一约束示例 ALTER TABLE Student ADD CONSTRAINT UQ_Student_Sname UNIQUE (Sname); -- 非聚簇索引按系别查学生 CREATE NONCLUSTERED INDEX IX_Student_Sdept ON Student(Sdept); -- 查看索引是否生效 EXEC sp_helpindex Student;sp_helpindex是排查索引有没有建上的常用命令输出里能看到索引名、类型和列。如果实验报告要求分析查询性能可以在 SSMS 里按 CtrlM 打开“实际执行计划”对比建索引前后扫描方式的变化。这里有个血泪经验外键列上如果没建索引删除主表数据时会全表扫描子表数据量一大就卡死实验里数据少看不出来但报告里写上这条分析会加分。3. DML 增删改查与事务把数据跑活3.1 插入、更新、删除的标准写法与批量技巧数据操作是实验报告的核心章节通常要求每个表至少插入若干条记录再做更新和删除。单条插入谁都会但实验报告往往要求“插入 20 条以上测试数据”手写 20 条 INSERT 既慢又容易错。常见做法是用INSERT INTO ... VALUES多行语法或者用SELECT ... UNION ALL批量生成。-- 多行插入SQL Server 2008 及以上支持 INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept) VALUES (2021000001, N张三, 男, 20, N计算机), (2021000002, N李四, 女, 19, N软件工程), (2021000003, N王五, 男, 21, N计算机); -- 用 UNION ALL 批量插入课程 INSERT INTO Course (Cno, Cname, Ccredit, Cpno) SELECT C001, N数据库, 4, NULL UNION ALL SELECT C002, N操作系统, 4, NULL UNION ALL SELECT C003, N数据结构, 4, C002; -- 更新把计算机系学生年龄加 1 UPDATE Student SET Sage Sage 1 WHERE Sdept N计算机; -- 删除删掉没有选课记录的学生注意外键顺序 DELETE FROM Student WHERE Sno NOT IN (SELECT Sno FROM SC);参数说明N中文前缀表示 Unicode 字符串不加 N 在部分排序规则下会乱码这是实验报告截图里中文变问号的常见原因。UPDATE和DELETE一定要带WHERE实验里可以先SELECT出要影响的行确认无误再改成UPDATE这个习惯能救命。删除时如果子表有引用直接删主表会报外键冲突正确顺序是先删子表记录再删主表或者建外键时加ON DELETE CASCADE但实验报告里建议手动控制顺序把外键约束的作用讲清楚。3.2 多表连接查询实验报告里分值最高的 SQL查询部分通常要求写单表查询、连接查询、嵌套查询、分组统计各若干条。连接查询是重点内连接、左外连接、自连接都要会。下面几条覆盖了实验报告最常见的题型。-- 内连接查每个学生的选课和成绩 SELECT s.Sno, s.Sname, c.Cname, sc.Grade FROM Student s JOIN SC sc ON s.Sno sc.Sno JOIN Course c ON sc.Cno c.Cno ORDER BY s.Sno; -- 左外连接查所有学生没选课的也显示 SELECT s.Sno, s.Sname, sc.Cno, sc.Grade FROM Student s LEFT JOIN SC sc ON s.Sno sc.Sno; -- 分组统计每门课的平均分、最高分、选课人数 SELECT c.Cno, c.Cname, AVG(sc.Grade) AS AvgGrade, MAX(sc.Grade) AS MaxGrade, COUNT(sc.Sno) AS StuCount FROM Course c LEFT JOIN SC sc ON c.Cno sc.Cno GROUP BY c.Cno, c.Cname HAVING COUNT(sc.Sno) 1; -- 嵌套查询查平均分高于全体平均分的学生 SELECT Sno, Sname FROM Student WHERE Sno IN ( SELECT Sno FROM SC GROUP BY Sno HAVING AVG(Grade) (SELECT AVG(Grade) FROM SC) );逻辑上LEFT JOIN保证左表全保留右表没匹配的补 NULL统计选课人数时用COUNT(sc.Sno)而不是COUNT(*)否则没选课的学生会被算成 1。GROUP BY后面必须包含所有非聚合列这是 SQL Server 的硬性要求漏写就报错。HAVING过滤分组后的结果WHERE过滤分组前的行两者别混。如果实验报告要求“查询选修了数据库课程的学生”用嵌套查询或连接都行报告里可以两种都写对比执行计划。3.3 事务与并发实验报告里拉开差距的部分很多实验报告只要求增删改查但想拿高分通常会加事务和并发控制。事务的 ACID 特性、BEGIN TRAN、COMMIT、ROLLBACK是必考。下面用转账场景演示这是最经典的例子。-- 转账事务A 扣 100B 加 100要么都成功要么都回滚 BEGIN TRANSACTION; BEGIN TRY UPDATE Account SET Balance Balance - 100 WHERE AccNo A001; -- 模拟中途出错可注释掉下面这行做正常提交 -- INSERT INTO Account (AccNo, Balance) VALUES (A001, 0); -- 主键冲突 UPDATE Account SET Balance Balance 100 WHERE AccNo B001; COMMIT TRANSACTION; PRINT 转账成功; END TRY BEGIN CATCH ROLLBACK TRANSACTION; PRINT 转账失败已回滚 ERROR_MESSAGE(); END CATCH;BEGIN TRY...BEGIN CATCH是 SQL Server 处理事务错误的推荐写法比单纯判断ERROR清晰。ROLLBACK必须在CATCH里执行否则事务会一直挂着锁住表后续查询全部超时这就是热搜里“数据库死锁”“数据库并发锁”的典型来源。实验里可以开两个查询窗口模拟并发窗口 A 执行BEGIN TRAN后更新某行但不提交窗口 B 去更新同一行会阻塞等 A 提交或回滚后 B 才继续。把这个现象截图写进报告比只贴代码有说服力。注意实验机上如果事务没提交就关窗口SSMS 会提示有未提交事务选回滚否则锁会残留。4. DCL 权限与视图触发器把实验报告收口4.1 用户、角色与权限授予回收DCL 是实验报告里最容易被忽略但老师一定会看的部分。常见要求是创建一个登录名、一个数据库用户、一个角色给角色授权再把用户加入角色最后回收权限验证。SQL Server 的权限分服务器级和数据库级实验里一般只涉及数据库级。-- 创建服务器登录名 CREATE LOGIN lab_user WITH PASSWORD Lab2024; -- 在实验库中创建对应用户 USE StudentCourse; CREATE USER lab_user FOR LOGIN lab_user; -- 创建角色并授权 CREATE ROLE role_query; GRANT SELECT ON Student TO role_query; GRANT SELECT ON Course TO role_query; GRANT SELECT ON SC TO role_query; -- 把用户加入角色 ALTER ROLE role_query ADD MEMBER lab_user; -- 验证权限用 lab_user 登录后只能查不能改 -- 回收权限 REVOKE SELECT ON SC FROM role_query;参数说明GRANT授予权限REVOKE回收权限DENY显式拒绝且优先级最高。实验报告里要区分REVOKE和DENYREVOKE只是取消授予用户可能从角色继承到权限DENY则无论从哪继承都拒绝。验证时用EXECUTE AS USER lab_user切换上下文再执行查询和更新看是否被拒比重新登录快。-- 切换用户上下文验证权限 EXECUTE AS USER lab_user; SELECT * FROM Student; -- 应该成功 UPDATE Student SET Sage 22 WHERE Sno 2021000001; -- 应该失败 REVERT; -- 切回原用户4.2 视图和触发器实验报告的综合应用视图和触发器是实验报告最后几节的常客。视图用来简化多表查询和做权限隔离触发器用来实现审计或级联操作。下面各给一个最小示例。-- 视图学生选课成绩汇总 CREATE VIEW V_StudentGrade 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 sc.Cno c.Cno; -- 查询视图 SELECT * FROM V_StudentGrade WHERE Grade 90; -- 触发器记录 SC 表的成绩修改历史 CREATE TABLE GradeLog ( LogID INT IDENTITY(1,1) PRIMARY KEY, Sno CHAR(10), Cno CHAR(6), OldGrade DECIMAL(5,1), NewGrade DECIMAL(5,1), LogTime DATETIME DEFAULT GETDATE() ); GO CREATE TRIGGER TR_SC_Update ON SC AFTER UPDATE AS BEGIN IF UPDATE(Grade) INSERT INTO GradeLog (Sno, Cno, OldGrade, NewGrade) SELECT d.Sno, d.Cno, d.Grade, i.Grade FROM deleted d JOIN inserted i ON d.Sno i.Sno AND d.Cno i.Cno; END; GO触发器的关键是inserted和deleted两张临时表INSERT时只有insertedDELETE时只有deletedUPDATE时两张都有分别存旧值和新值。IF UPDATE(Grade)判断是否更新了指定列避免无关更新也写日志。实验报告里如果要求“删除学生时自动删除其选课记录”把AFTER UPDATE换成AFTER DELETE在触发器里DELETE FROM SC WHERE Sno IN (SELECT Sno FROM deleted)即可。注意触发器里不要写COMMIT否则会报错。5. 实验报告避坑与排查那些让我返工三次的问题5.1 中文乱码与排序规则现象插入的中文姓名在 SSMS 里显示正常但用 JDBC 或导出 CSV 后变成问号。原因列类型用了VARCHAR而不是NVARCHAR或者连接字符串没指定字符集。解决建表时中文列一律用NVARCHAR插入时字符串加N前缀JDBC 连接串加characterEncodingUTF-8。如果库已经建好用ALTER TABLE ... ALTER COLUMN改类型但注意有数据时可能失败先备份。5.2 外键冲突与删除顺序现象DELETE FROM Student WHERE Sno2021000001报“与外键约束冲突”。原因该学生在 SC 表里有选课记录。解决先删 SC 中对应记录再删 Student或者建外键时加ON DELETE CASCADE。实验报告里建议手动两步删除并在报告里说明参照完整性。查询哪些子表引用了主表可以用sp_fkeys Student。5.3 事务未提交导致锁表现象某个查询窗口执行更新后忘了提交另一个窗口查同一张表一直转圈。原因未提交事务持有排他锁。解决在第一个窗口执行COMMIT或ROLLBACK或者用KILL杀掉阻塞的会话。查阻塞用sp_who2或查sys.dm_exec_requests。预防习惯是开事务后尽快提交调试时先SELECT确认再UPDATE。5.4 密码策略与登录失败现象新建登录名时报“密码不符合 Windows 策略要求”。原因SQL Server 默认启用密码复杂度检查。解决设一个含大小写、数字、符号的密码或者用CHECK_POLICY OFF关闭策略仅实验环境。热搜里“sql server 2022 关闭密码策略”“sql server 2012 密码到期”都是这类问题。关闭策略的语句是ALTER LOGIN lab_user WITH CHECK_POLICY OFF;。5.5 实验报告截图与代码不一致现象报告里贴的代码和截图结果对不上老师一眼看出。原因改代码后没重新执行就截图或者截图是别人的。解决每改一次脚本就整体重跑一遍按顺序截图截图里带上查询窗口的数据库名和结果行数。这个坑看似低级但每年都有人栽返工重做的时间够把整个实验重写一遍。6. 用执行计划和系统视图验证你的实验一个收尾技巧实验报告交上去之前我一般会做两件事验证一是用执行计划确认索引真的被用上了二是用系统视图把库里的对象列一遍防止漏建约束或触发器。这两步花不了十分钟但能挡住大部分“看起来对、实际没生效”的问题。先看执行计划。在 SSMS 里点“包括实际执行计划”按钮或者用快捷键 CtrlM然后执行查询。比如查某系学生SET STATISTICS IO ON; SELECT Sno, Sname FROM Student WHERE Sdept N计算机; SET STATISTICS IO OFF;如果IX_Student_Sdept建对了执行计划里会出现 Index Seek 而不是 Table Scan消息栏里逻辑读次数也会明显下降。把这两个数字记进报告比空写“索引提高了查询效率”有说服力。如果还是 Table Scan检查索引列和查询条件是否一致或者数据量太小优化器直接选全表扫描实验里可以插入几百行再测。再用系统视图盘一遍对象-- 列出所有表、列、类型 SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS DataType, c.max_length FROM sys.tables t JOIN sys.columns c ON t.object_id c.object_id JOIN sys.types ty ON c.user_type_id ty.user_type_id ORDER BY t.name, c.column_id; -- 列出所有约束 SELECT name, type_desc, parent_object_id FROM sys.objects WHERE type IN (PK,FK,UQ,C,D); -- 列出所有触发器和视图 SELECT name, type_desc FROM sys.objects WHERE type IN (TR,V);sys.objects里type的取值PK 主键、FK 外键、UQ 唯一、C 检查、D 默认、TR 触发器、V 视图。对着实验指导书一条条核对缺哪个补哪个。这个习惯是我做第一个数据库实验时被老师退回三次后养成的后来每次交报告前跑一遍再没因为漏对象返工。数据库实验报告的价值不在文档本身而在你能不能把这一整套从建库到权限的流程独立跑通、排错、复现。希望帮到你。本文还有配套的精品资源点击获取