华科数据库实验报告全流程:SQL Server建库建表、DML与DCL实战指南
简介这份《华科数据库实验报告》面向高校数据库课程学习者尤其是正在完成《数据库系统概论》实验的学生用于参考实验流程、报告结构与操作要点。内容围绕SQL Server 2008展开涵盖DDL、DML、DCL三大语言的应用以及数据库备份与恢复等核心知识并细分为基本表创建与数据插入、数据查询、数据修改与删除、视图操作、库函数与授权控制、备份恢复六个实验模块目录层次清晰便于按实验进度逐项对照。资源包共1个doc文件约294KB为完整实验报告文档包含实验目的、原理、内容、过程与心得体会等章节可直接借鉴报告框架与SQL语句组织方式。目前已有252人学习下载适合需要梳理实验思路、规范报告撰写或复习SQL语法的读者参考使用。1. 从一份“华科数据库实验报告.doc”说起它到底在练什么很多人第一次看到“华科数据库实验报告.doc”这个标题以为就是一份 Word 文档复制粘贴交差。但真正做过这份实验的人知道它背后是一整套数据库从建库、建表、增删改查到权限控制、事务并发的完整训练链路。华科数据库实验通常围绕 SQL Server 展开要求你独立完成 DDL 定义、DML 操作、DCL 授权最后把过程、截图、SQL 语句和结果整理成报告。它解决的不是“会不会写 SELECT”这种单点问题而是让你在真实数据库环境里跑通一条从设计到落地的闭环。适合谁正在上数据库课程、需要交实验报告的学生以及想系统补 SQL Server 实操的初级开发。如果你只背过语法却没亲手建过库、没被死锁卡过、没因为外键顺序翻车这份实验就是补课的机会。下面我按自己带人做实验的路径把每一步拆开讲清楚。2. 实验环境与 SQL Server 建库建表先把地基打对2.1 选 SQL Server 还是 MySQL实验报告为什么常锁 SQL Server华科数据库实验报告多数版本默认 SQL Server原因很实际SQL Server Management StudioSSMS图形化程度高建表、画关系图、导出脚本一条龙老师验收时截图直观。MySQL 也能做但实验指导书里的示例语句、系统函数、权限语法和 SQL Server 有差异比如IDENTITY自增、GO批处理分隔符、sys.databases系统视图换库后容易对不上。我的建议是如果指导书没强制优先跟指导书走如果强制 SQL Server就装 Developer 版或 Express 版别用太老的 2000/2008语法和 SSMS 兼容性会让你多花时间。安装时记住实例名默认MSSQLSERVER命名实例类似SQLEXPRESS后面连接字符串要用。2.2 用 T-SQL 建库建表的最小可复现脚本实验第一步通常是创建数据库和若干表。下面这段脚本可以直接在 SSMS 新查询窗口执行建一个HustDB库和三张典型表学生、课程、选课。-- 如果已存在则删除方便反复实验 IF DB_ID(HustDB) IS NOT NULL DROP DATABASE HustDB; GO CREATE DATABASE HustDB; GO USE HustDB; GO -- 学生表 CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, -- 学号主键 Sname NVARCHAR(20) NOT NULL, -- 姓名 Ssex CHAR(2) CHECK (Ssex IN (男,女)), Sage INT CHECK (Sage BETWEEN 15 AND 60), Sdept NVARCHAR(30) -- 院系 ); GO -- 课程表 CREATE TABLE Course ( Cno CHAR(6) PRIMARY KEY, -- 课程号 Cname NVARCHAR(40) NOT NULL, Ccredit DECIMAL(3,1) CHECK (Ccredit 0) ); GO -- 选课表复合主键 两个外键 CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(6) NOT NULL, 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) ); GO逻辑说明IF DB_ID(...) IS NOT NULL DROP DATABASE是为了让脚本可重复执行避免每次手动删库。GO是 SSMS 的批处理分隔符不是 T-SQL 语句用来把CREATE DATABASE和后续USE分开否则会报“数据库正在使用”。参数上CHAR(10)定长适合学号这种固定长度NVARCHAR支持中文CHECK约束把性别和年龄卡住实验报告里加上约束能体现完整性设计。外键顺序要注意先建Student和Course再建SC否则外键引用会失败。2.3 建表后必做的三件验证建完表别急着插数据先跑三条验证第一EXEC sp_help Student;看列定义和约束是否生效第二在 SSMS 对象资源管理器里刷新确认表出现在HustDB下第三试着插一条违反CHECK的数据比如Sage10看是否被拒绝。这三步能提前暴露字符集、约束名冲突、架构归属等问题。很多实验报告翻车就翻在“表建了但约束没生效”最后数据乱七八糟查半天才发现是CHECK写错或没加WITH CHECK。3. DML 增删改查与 DCL 权限把实验报告的核心操作跑通3.1 插入、更新、删除的批量写法与事务包裹DML 是实验报告里截图最多的部分。插入数据时常见做法是批量INSERT但要注意外键依赖顺序先Student、Course再SC。下面这段脚本演示插入、更新、删除并用事务包裹方便出错回滚。USE HustDB; GO BEGIN TRANSACTION; -- 批量插入学生 INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept) VALUES (2023000001, N张三, 男, 20, N计算机), (2023000002, N李四, 女, 21, N软件工程), (2023000003, N王五, 男, 19, N计算机); -- 插入课程 INSERT INTO Course (Cno, Cname, Ccredit) VALUES (CS101, N数据库原理, 3.0), (CS102, N操作系统, 4.0); -- 插入选课注意外键必须已存在 INSERT INTO SC (Sno, Cno, Grade) VALUES (2023000001, CS101, 88.5), (2023000002, CS101, 92.0), (2023000001, CS102, 76.0); -- 更新给 CS101 低于 90 的加 2 分 UPDATE SC SET Grade Grade 2 WHERE Cno CS101 AND Grade 90; -- 删除删掉没选课的学生示例实际按需求 DELETE FROM Student WHERE Sno NOT IN (SELECT Sno FROM SC); COMMIT TRANSACTION;逻辑说明BEGIN TRANSACTION到COMMIT之间是一个原子操作如果中间某条违反外键或约束可以ROLLBACK回到起点避免半截数据。参数上N中文前缀表示 Unicode 字符串不加N在NVARCHAR列里可能乱码。UPDATE的WHERE一定要写否则全表更新实验报告里这是经典事故。DELETE同理先SELECT验证条件再删。3.2 多表连接查询实验报告里最容易被追问的部分实验报告通常要求写几个连接查询比如查每个学生的选课和成绩、查平均分、查没选课的学生。下面给两个典型查询。-- 查询每个学生的选课成绩含学生姓名和课程名 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, c.Cno; -- 查询平均分高于 80 的课程 SELECT c.Cno, c.Cname, AVG(sc.Grade) AS AvgGrade FROM Course c JOIN SC sc ON c.Cno sc.Cno GROUP BY c.Cno, c.Cname HAVING AVG(sc.Grade) 80;逻辑说明JOIN默认是内连接只返回匹配行如果要查没选课的学生得用LEFT JOIN并在WHERE里判sc.Sno IS NULL。GROUP BY后SELECT的列必须是分组列或聚合函数否则 SQL Server 报错。HAVING过滤分组后的结果和WHERE过滤行不同实验报告里常考这个区别。3.3 DCL 授权与回收让实验报告体现权限管理DCL 是很多实验报告忽略的部分但华科实验常要求创建登录名、数据库用户并授权。下面演示创建用户并给SELECT权限。USE master; GO -- 创建服务器登录名 CREATE LOGIN hust_user WITH PASSWORD Hust2024; GO USE HustDB; GO -- 创建数据库用户并映射登录名 CREATE USER hust_user FOR LOGIN hust_user; GO -- 授予查询权限 GRANT SELECT ON SC TO hust_user; -- 回收权限 REVOKE SELECT ON SC FROM hust_user; GO逻辑说明SQL Server 权限分服务器级和数据库级CREATE LOGIN在master库执行CREATE USER在目标库执行。GRANT授权REVOKE回收DENY是显式拒绝且优先级更高。参数上密码要符合复杂度策略否则创建失败。实验报告里把授权前后用不同用户登录查询的截图放上能体现 DCL 的实际效果。4. 实验报告避坑那些年我们踩过的数据库坑4.1 外键顺序导致插入失败现象插入SC表时报“外键约束冲突”。原因SC的Sno或Cno在Student、Course里不存在或者插入顺序反了。解决先插父表再插子表批量插入时用SET NOCOUNT ON减少干扰但关键还是检查数据。如果确实要临时关闭约束用ALTER TABLE SC NOCHECK CONSTRAINT ALL但实验报告里不建议容易掩盖设计问题。4.2 中文乱码与排序规则现象插入中文后显示问号或乱码。原因列用了VARCHAR而不是NVARCHAR或者连接时字符集不匹配。解决建表时中文列统一NVARCHAR插入时加N前缀数据库排序规则选Chinese_PRC_CI_AS或类似支持中文的。已经建错的表用ALTER TABLE ... ALTER COLUMN改类型但注意长度和约束。4.3 事务未提交导致锁等待现象SSMS 里查询一直转圈其他窗口也卡住。原因某个窗口开了事务但没COMMIT或ROLLBACK锁住了表。解决查sys.dm_tran_locks和sys.dm_exec_requests找到阻塞会话KILL掉或者养成习惯事务里操作完立刻提交。实验报告里如果截图卡住先检查是不是自己忘了提交。4.4 权限授予后仍无法访问现象GRANT SELECT后用户还是查不了。原因用户没有连接到该数据库的权限或者架构dbo的权限没给。解决确认CREATE USER成功必要时GRANT CONNECT TO hust_user或者把对象权限授到具体架构。另外DENY会覆盖GRANT检查有没有遗留的拒绝。4.5 实验报告截图与 SQL 不一致现象报告里的结果和实际跑出来的不一样。原因截图是旧版本或者手动改了数据没重新执行脚本。解决每次实验从建库脚本重新跑一遍截图前确认当前数据库和查询窗口一致。我的习惯是脚本存成.sql文件报告里贴脚本原文截图只作为结果佐证。5. 进阶技巧用脚本自动生成实验报告素材与验证结果5.1 用 T-SQL 导出表结构和数据脚本实验报告常要求附建表语句和数据。SSMS 右键数据库 → 任务 → 生成脚本可以导出整个库的 DDL。但更可控的方式是查系统视图拼 SQL。下面这段查询能列出所有表和列定义方便复制进报告。SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS DataType, c.max_length, c.is_nullable 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;逻辑说明sys.tables、sys.columns、sys.types是 SQL Server 的系统目录视图比INFORMATION_SCHEMA更全。参数上max_length对NVARCHAR是字节数实际字符数要除以 2。这个查询结果可以直接贴进实验报告的“表结构”章节比截图更清晰。5.2 用事务和错误处理验证约束是否生效实验报告里如果能展示“约束确实拦住了非法数据”会加分。下面用TRY...CATCH捕获错误并回滚。BEGIN TRY BEGIN TRANSACTION; INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept) VALUES (2023000004, N赵六, 男, 10, N计算机); -- Sage10 违反 CHECK COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; SELECT ERROR_MESSAGE() AS ErrorMsg, ERROR_NUMBER() AS ErrorNo; END CATCH;逻辑说明TRY...CATCH是 T-SQL 的错误处理结构ERROR_MESSAGE()返回具体错误。参数上Sage10故意触发CHECK约束CATCH里回滚并输出错误信息。实验报告里把这段和正常插入对比能证明约束有效。5.3 验证权限切换用户执行查询授权后怎么验证在 SSMS 里新建查询用“以其他用户身份连接”或者EXECUTE AS USER。下面演示EXECUTE AS。USE HustDB; GO EXECUTE AS USER hust_user; SELECT * FROM SC; -- 如果已 REVOKE这里应报权限错误 REVERT; GO逻辑说明EXECUTE AS USER模拟指定用户执行REVERT恢复当前用户。参数上hust_user必须已存在且当前登录有模拟权限。实验报告里把授权前报错、授权后成功、回收后再次报错的截图放上DCL 部分就完整了。5.4 我的习惯先写脚本再写报告带过几届学生后我最大的教训是别先写 Word 再补 SQL。正确顺序是先把所有操作写成可重复执行的.sql脚本跑通、截图、记录错误最后把脚本和截图整理进报告。这样报告里的每条语句都能复现老师追问也不慌。数据库实验的玄学在于环境差异同一份脚本在不同机器上可能因为排序规则、版本、实例名出问题所以脚本头部加上USE和必要的IF EXISTS判断能省很多后悔药。希望帮到你。本文还有配套的精品资源点击获取