ARTICLE DETAIL

资讯详情

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

SQL Server实验大作业实战:从建库建表到报告避坑全流程

SQL Server实验大作业实战:从建库建表到报告避坑全流程 简介面向软件工程本科生的数据库SQL Server实验大作业以小区物业收费管理系统为业务背景完整覆盖从需求分析、E-R图设计到建表、查询、视图、索引、授权及用户操作等全流程。资源共16个文件包含13个sql脚本、1份docx实验报告、1份pdf的E-R图以及1份可修改的vsd图表压缩包大小12.33MB目录结构清晰方便按模块查阅。已有1428人学习下载适合正在完成数据库课程设计或期末大作业的本科生参考。sql脚本按功能拆分呈现了建表、插入数据、多表查询、视图、索引、用户创建与授权管理、数据更新删除等典型操作对应小区物业收费中的收费计算与权限控制场景同步提供的实验报告和E-R图有助于理解需求分析、概念结构设计与物理实现之间的映射关系可迁移至同类管理信息系统开发。1. 数据库 Microsoft SQL Server实验大作业到底要交什么不是代码堆砌是一套可复现的过程“数据库 Microsoft SQL Server实验大作业包含代码及实验报告”这类题目通常出现在数据库课程结课、短学期实训或毕业设计前置任务里。老师给的交付物很明确一套能跑通的 SQL Server 代码加上一份能解释“为什么这么设计”的实验报告。但大多数学生把时间全砸在写 SQL 上最后因为环境连不上、报告里只有代码没有运行证据、脚本路径写死等原因被打回。这篇笔记按我自己的完成路径来写先选环境再建库表然后写 CRUD、视图、存储过程、事务这些必考动作最后把结果变成报告素材。适合独立完成课程设计的学生也适合要快速搭一套演示项目给答辩用的从业者。2. 从零搭实验环境选对版本与建库建表实验报告的第一张王牌实验作业里最不该翻车的就是环境。很多人的代码本身没错错在 SQL Server 版本理解、实例名、驱动和排序规则。这章先把环境定下来再给一套建库建表脚本最后讲怎么造测试数据。2.1 安装 SQL Server 与 SSMS版本、实例和连接驱动的选择常见的做法是装 SQL Server Developer Edition它是免费的功能和 Enterprise 版几乎一样没有 Express 那种数据库大小和内存限制拿来交实验作业完全够。注意 Developer 版装出来的默认实例名是MSSQLSERVER连接字符串里写localhost或.就能连。如果你之前装过 Express实例名会变成类似localhost\SQLEXPRESS后面所有脚本里的服务器名都要跟着改这是第一个隐藏坑。官方提供的 SSMS 是独立安装包不在 SQL Server 安装盘里需要另外下载。SSMS 版本建议用最新的稳定版它管理老实例也没问题。装好后先做一个连通性检查用 Windows 身份验证执行一条查询sqlcmd -S localhost -E -Q SELECT VERSION-S指定服务器名和实例名-E表示使用 Windows 身份验证不写用户名密码-Q是执行完即退出。如果这条命令能回显 SQL Server 版本信息说明核心服务正常。要是报错“找不到服务器”先打开“SQL Server 配置管理器”确认 SQL Server 服务是否启动再确认实例名。如果准备用 Python 或 Excel 连数据库需要额外装一个驱动。最常见的是ODBC Driver 17 for SQL Server或 18Python 里用pyodbc连接时连接字符串里的 Driver 名必须和实际安装的驱动完全一致。后文 4.3 会给出完整示例这里先记住一个自查命令在 cmd 里执行odbcad32.exe到“驱动程序”页签看列表里有没有对应名称。2.2 建一个「学生选课」库建表脚本与主外键设计实验作业的选题最不容易出错的是“学生选课系统”。三张表就能讲清主键、外键、约束、关联查询这些必考知识点。我一般把库名定为StudentCourse排序规则显式设成Chinese_PRC_CI_AS避免后面中文乱码。-- 建库指定排序规则CI_AS 表示不区分大小写、区分重音 CREATE DATABASE StudentCourse COLLATE Chinese_PRC_CI_AS; GO USE StudentCourse; GO -- 学生表 CREATE TABLE Students ( StudentID INT NOT NULL, -- 学号主键 StudentName NVARCHAR(50) NOT NULL, -- 姓名用 NVARCHAR 存中文 Gender NCHAR(1) NULL, -- 性别 EnrollmentDate DATE NULL -- 入学日期 CONSTRAINT PK_Students PRIMARY KEY (StudentID) ); GO -- 课程表 CREATE TABLE Courses ( CourseID INT NOT NULL, -- 课程号主键 CourseName NVARCHAR(100) NOT NULL, -- 课程名 Credits DECIMAL(3,1) NOT NULL -- 学分如 2.5 CONSTRAINT PK_Courses PRIMARY KEY (CourseID) ); GO -- 选课表复合主键 外键 CREATE TABLE SC ( StudentID INT NOT NULL, CourseID INT NOT NULL, Score DECIMAL(5,2) NULL, -- 成绩允许先为空 CONSTRAINT PK_SC PRIMARY KEY (StudentID, CourseID), CONSTRAINT FK_SC_Students FOREIGN KEY (StudentID) REFERENCES Students(StudentID), CONSTRAINT FK_SC_Courses FOREIGN KEY (CourseID) REFERENCES Courses(CourseID), CONSTRAINT CK_SC_Score CHECK (Score 0 AND Score 100) ); GO这段脚本里有几个实验报告必写的点。COLLATE是排序规则Chinese_PRC_CI_AS是简体中文常用的规则字段用NVARCHAR而不是VARCHAR因为前者能直接存 Unicode 中文后者在排序规则不对时会变成问号。SC表使用(StudentID, CourseID)作为复合主键作用是天然阻止同一个人重复选同一门课。外键约束保证插入选课记录时学号和课程号必须先存在。最后的CHECK约束限制成绩在 0 到 100 之间这是实验报告中“数据完整性”的直观例子。2.3 插入测试数据时故意留几个坑报告里的「问题与解决」素材建完表先插入几条测试数据这样后续增删改查才有对象。测试数据要覆盖典型情况比如有学生没选课、有课程没人选、也有成绩超过 100 的非法记录用来触发约束。USE StudentCourse; GO INSERT INTO Students (StudentID, StudentName, Gender, EnrollmentDate) VALUES (1, N张伟, N男, 2024-09-01), (2, N李娜, N女, 2024-09-01), (3, N王强, N男, 2023-09-01); GO INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (101, N数据库原理, 3.0), (102, N数据结构, 4.0), (103, N操作系统, 3.5); GO INSERT INTO SC (StudentID, CourseID, Score) VALUES (1, 101, 87.5), (2, 101, 92.0), (3, 102, NULL); -- 学生 3 选了课但还没出成绩 GO插入字符串时中文前面必须加N大写字母这是 SQL Server 里 Unicode 常量的标记。不加N时即使字段是NVARCHAR在某些场景下也可能出现转换问题。SC表里故意留一行NULL成绩后面做查询时可以用IS NULL写判断条件实验报告里能多写一段“注意 NULL 不能使用 比较”。数据插好后可以试着执行一条违反约束的插入比如给成绩填 120观看报错信息。这一步建议截图保存在报告“问题与解决”里写“通过设计 CHECK 约束系统在插入非法数据时报错说明数据库层校验有效。”这种细节比空谈理论更能体现动手能力。3. 把实验代码写成报告能讲清的样子增删改查、视图、存储过程与事务数据库实验大作业的评分权重一半看代码能不能跑另一半看代码结构能不能讲出道理。这章按实验报告最常要求的顺序来写基础 CRUD、视图与存储过程、事务与触发器。每个代码块都可以直接抄进.sql文件相关注释就是报告里的设计说明素材。3.1 基础 CRUD四条必写语句和它们的执行顺序增删改查是实验报告的第一部分要求简单但讲究细节。给出一个最典型的“按课程查名单、改成绩、删退课”场景USE StudentCourse; GO -- 查询选修 101 课程的学生名单按成绩降序 SELECT s.StudentID, s.StudentName, sc.Score FROM Students s JOIN SC sc ON s.StudentID sc.StudentID WHERE sc.CourseID 101 ORDER BY sc.Score DESC; GO -- 更新把学号 1 在 101 课程的成绩改为 95 UPDATE SC SET Score 95 WHERE StudentID 1 AND CourseID 101; GO -- 删除学号 3 退选 102 课程 DELETE FROM SC WHERE StudentID 3 AND CourseID 102; GO -- 插入新增一条选课记录成绩先不给 INSERT INTO SC (StudentID, CourseID, Score) VALUES (2, 103, NULL); GO这段代码的说明重点有三个。UPDATE和DELETE必须带WHERE否则会更新或删除全表这是新手最容易犯的灾难性错误建议在实验报告里写一句“在更新操作中使用条件过滤确保只影响目标记录”。JOIN查询要区分内连接和左连接上面用的是INNER JOIN只能返回有选课记录的学生如果想知道没选课的学生就要改成LEFT JOIN并判断SC.CourseID IS NULL。INSERT没有给Score值正好复用 2.3 说的NULL场景。执行完这些语句用 SSMS 分别做一次结果截图。报告里不要只贴代码要贴“执行前数据 → 执行后数据”的前后对比。比如更新成绩前先查一次更新后再查一次两张截图并排比一百字解释更有说服力。3.2 视图与存储过程让评委一眼看出你会“封装”视图和存储过程是实验报告里的“进阶项”。视图本质是一个保存的查询调用时就像表一样存储过程是预编译的 SQL 集合能传参数。作业里至少要各写一个并且在报告中解释它们与直接执行 SQL 的差别。USE StudentCourse; GO -- 视图每个学生已修课程的平均分 CREATE VIEW v_StudentAvgScore AS SELECT s.StudentID, s.StudentName, COUNT(sc.CourseID) AS CourseCount, AVG(sc.Score) AS AvgScore FROM Students s LEFT JOIN SC sc ON s.StudentID sc.StudentID GROUP BY s.StudentID, s.StudentName; GO -- 存储过程根据课程编号查询名单 CREATE PROCEDURE usp_GetCourseStudents CourseID INT AS BEGIN SET NOCOUNT ON; SELECT s.StudentID, s.StudentName, sc.Score FROM Students s JOIN SC sc ON s.StudentID sc.StudentID WHERE sc.CourseID CourseID ORDER BY sc.Score DESC; END; GO调用方式如下-- 查看视图数据 SELECT * FROM v_StudentAvgScore; GO -- 调用存储过程查 101 课程的学生 EXEC usp_GetCourseStudents CourseID 101; GO写进实验报告时要说明视图里使用LEFT JOIN而不是INNER JOIN的原因因为我们希望看到没有选课、平均分为NULL的学生左连接能保住左边表的所有行。存储过程里SET NOCOUNT ON是抑制“受影响行数”消息让结果集更干净。参数名CourseID是 SQL Server 变量的标准写法调用时可以用EXEC 过程名 参数 值显式传参增加可读性。3.3 事务和触发器把你选的业务规则钉在数据库里事务是实验报告里展示一致性的关键。常见业务是“选课成功后课程表里的选课人数 1”这个过程必须原子完成。触发器用来记录日志比如成绩被修改时自动写一条操作记录。这两块代码可以直接加到库里。USE StudentCourse; GO -- 给课程表增加一个选课人数列如果还没有 ALTER TABLE Courses ADD SelectedCount INT NOT NULL DEFAULT 0; GO -- 事务演示选课 人数加一保证两步要么都成功要么都失败 BEGIN TRANSACTION; UPDATE Courses SET SelectedCount SelectedCount 1 WHERE CourseID 101; INSERT INTO SC (StudentID, CourseID, Score) VALUES (3, 101, NULL); COMMIT TRANSACTION; GO -- 如果中途出错用 ROLLBACK 回滚实验报告里要写清楚事务的隔离性BEGIN TRANSACTION开启事务COMMIT提交所有修改ROLLBACK撤销本次事务内的全部操作。一个可以演示的翻车场景是如果先插入选课记录再更新人数而更新语句因为主键冲突出错整个事务会处于“打开”状态必须处理掉。所以代码里要先UPDATE后INSERT并且让INSERT成为最后一步减少事务持续时间。触发器可以记录成绩修改的历史-- 建日志表 CREATE TABLE ScoreLog ( LogID INT IDENTITY(1,1) PRIMARY KEY, StudentID INT NOT NULL, CourseID INT NOT NULL, OldScore DECIMAL(5,2), NewScore DECIMAL(5,2), ModifyTime DATETIME DEFAULT GETDATE() ); GO -- 触发器成绩列被 UPDATE 时写日志 CREATE TRIGGER trg_ScoreUpdate ON SC AFTER UPDATE AS BEGIN INSERT INTO ScoreLog (StudentID, CourseID, OldScore, NewScore) SELECT d.StudentID, d.CourseID, d.Score, i.Score FROM inserted i JOIN deleted d ON i.StudentID d.StudentID AND i.CourseID d.CourseID WHERE i.Score d.Score; END; GO触发器里有两个核心虚拟表inserted和deleted。AFTER UPDATE触发时inserted保存更新后的行deleted保存更新前的行两表通过主键关联。这里加入WHERE i.Score d.Score是为了避免值没变也写日志。写报告时重点解释触发器的触发时机与两个虚拟表的关系这部分内容讲清楚比贴十个 SELECT 都值钱。4. 实验报告不是说明书结构、截图与可视化展示很多人的实验报告是代码大全把所有 SQL 往文档里一贴就完事。但老师真正想看的是“你遇到了什么问题、怎么解决、最终结果怎样”。这章讲报告目录怎么搭SSMS 怎么截出有效证据以及如何用 Python 给报告加一张可视化图。4.1 一个让老师少问十句话的报告目录实验报告的结构建议固定为七个部分顺序不要乱。第一部分实验目的写清课程目标和本次实验要验证的知识点比如“掌握 SQL Server 的库表创建、数据完整性和事务机制”。第二部分实验环境列出操作系统、SQL Server 版本、SSMS 版本、机器硬件写“Windows 11 SQL Server 2022 Developer Edition”就够。第三部分数据库设计放 ER 图、表结构说明和约束列表。第四部分代码实现按功能模块分小节每段代码后面配文字说明。第五部分运行结果所有执行截图都在这里。第六部分问题与解决这是最容易被扣分但也最好凑的部分写调试过程中遇到的报错和排查思路。第七部分实验总结两三段即可不要长篇大论。可以做一个表结构清单放在第三部分格式如下表名字段类型约束说明StudentsStudentIDINT主键学号StudentsStudentNameNVARCHAR(50)NOT NULL姓名CoursesCourseIDINT主键课程号SCStudentIDINT外键 → Students学号SCCourseIDINT外键 → Courses课程号SCScoreDECIMAL(5,2)CHECK 0-100成绩这个表在 Word 里画出来占半页篇幅但信息密度极高。老师扫一眼就知道你把表结构弄清楚了不会追着你问字段含义。4.2 用 SSMS“结果到网格”和导出功能截出有效证据SSMS 的默认执行结果有两种显示方式“结果到网格”和“结果到文本”。做实验报告推荐用网格模式因为它带列名截图后读者一眼能辨清字段。在查询窗口执行一次查询后要截三样东西SQL 语句、结果集、对象资源管理器中的对应表节点。把三个窗口放进一张截图里证明你确实在真实实例上跑过。对于结果集比较大的查询可以用“结果到文件”导出 CSV再把关键行粘贴进报告。导出方法是在“查询”菜单里选“将结果保存为”或者右键结果集标题栏选择“另存为 CSV”。实验报告里贴大数据结果时只保留前 20 行即可不要铺满几页但要在截图下方注明“完整结果见附件 SQL 文件”。错误截图同样值钱。比如执行违反外键的插入时报错把红色错误信息整条截下来放在“问题与解决”里并解释为什么违反外键。这比编造一段“经过努力解决问题”有说服力得多。4.3 用 Python 连接 SQL Server 做一张趋势图报告立刻上档次如果实验要求只是交 SQL代码和截图已经够用。但多数实验报告会有“数据分析”或“综合展示”加分项。用 Python 读库画一张图属于性价比极高的加分操作。前提是本机装了pyodbc、pandas、matplotlibimport pandas as pd import pyodbc import matplotlib.pyplot as plt conn pyodbc.connect( Driver{ODBC Driver 17 for SQL Server}; Serverlocalhost; DatabaseStudentCourse; Trusted_Connectionyes; Encryptno; # 实验环境里关闭加密避免证书报错 ) sql SELECT c.CourseName, COUNT(sc.StudentID) AS StudentCount FROM Courses c LEFT JOIN SC sc ON c.CourseID sc.CourseID GROUP BY c.CourseName; df pd.read_sql_query(sql, conn) conn.close() plt.bar(df[CourseName], df[StudentCount]) plt.title(选课人数统计) plt.xlabel(课程) plt.ylabel(人数) plt.savefig(course_stats.png, dpi300, bbox_inchestight)这段代码里连接字符串的每一项都有对应坑。Driver名要和系统安装的 ODBC 驱动一致装的是 18 就写 18。Serverlocalhost对默认实例有效命名实例要写成localhost\\实例名。Trusted_Connectionyes表示用当前 Windows 账号登录实验环境最常见。Encryptno是实验妥协后面避坑章会说为什么。图中LEFT JOIN保证没人选的课程也以 0 条显示而不是直接消失。运行后生成course_stats.png插入报告第五部分再配一段 50 字的分析比如“数据库原理课程选课人数最多操作系统课程目前无人选课后续需要调整开课策略”。5. SQL Server 实验大作业避坑手册连不上、中文乱码、备份还原失败这章写的全是复制代码过程中真实会踩的坑每条都按“现象 → 原因 → 解决”给出来可直接对照排错。5.1 连接字符串报 SSL 证书链错误加 TrustServerCertificate 就够了吗现象用 Python 或 SSMS 连接 SQL Server 时抛出类似[08001] [microsoft][odbc driver 17 for sql server]ssl 提供程序: 证书链是由不受信任的颁发机构颁发的。的错误后面还跟着客户端无法建立连接 (-2146893019)。原因新版本 SQL Server 默认启用强制加密但开发环境里用的是自签名证书客户端不信任它。这个报错不是密码错误也不是服务器不存在纯粹是 TLS 握手阶段证书校验失败。解决如果是 ODBC 连接在连接字符串中加入TrustServerCertificateyes或者直接Encryptno。前者表示“即使证书不受信任也接受它”后者表示“本次连接不加密”。两者选一个就行。我一般用Encryptno因为实验环境里没有敏感数据省去证书链纠缠。如果是 SSMS 连不上可以在“连接选项”的“加密”下拉框里选择“Mandatory”并勾选“信任服务器证书”。生产环境千万不能关加密这是实验作业的临时做法。5.2 装完 SQL Server 2022 连不上 .bak版本和权限各占一半现象拿到老师发的database.bak在 SSMS 里选“还原数据库”结果报“数据库版本高于服务器版本”或者“文件目录无效无法打开备份设备”。原因第一个错是版本降级问题。高版本实例备份出来的.bak不能用低版本实例还原比如老师用 SQL Server 2019 备份你用 2016 还原就会报版本高。第二个错是文件系统权限MSSQLSERVER服务账号可能对.bak所在目录没有读权限。解决先查备份文件实际版本最简单的办法是问老师用的什么版本或者自己在电脑上装一个同版本或更高版本实例。权限问题可以先把.bak复制到 SQL Server 默认备份目录通常是C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Backup。还可以用 T-SQL 指定路径还原RESTORE DATABASE StudentCourse FROM DISK NC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Backup\StudentCourse.bak WITH REPLACE;如果只是想把表数据读出来看一眼不一定要还原整个库。可以先用 SSMS 的“导入数据”向导把.bak里的表导到新建库但那不等于还原备份实验报告里别混着写。提交作业时最好同时提供.sql初始化脚本和.bak备份两个都试过能跑老师那边就少一个骂你的理由。5.3 中文变成问号排序规则与 N 前缀现象向表中插入张三查询结果却是???或者显示成乱码。原因有两个层面。如果建库时没有指定中文排序规则默认排序规则SQL_Latin1_General_CP1_CI_AS对中文支持不友好如果字段类型是VARCHAR只能存单字节字符中文需要双字节存进去就丢数据如果插入字符串前没加NSQL Server 会把字符串先按数据库的代码页转换中文出处就在这一层。解决建库加COLLATE Chinese_PRC_CI_AS字段用NVARCHAR插入时加N前缀。对已存在的表可以修改字段类型ALTER TABLE Students ALTER COLUMN StudentName NVARCHAR(50) NOT NULL;改完再重新插入数据。实验报告里遇到乱码千万不要只说“换成中文排序规则就成功了”要把排查路径写出来先查字段类型再看插入语句有没有N最后才是排序规则。这三个环节任何一个断了中文都会变问号。5.4 提交的代码在老师机器上跑不起来路径和实例名写死是头号原因现象自己电脑上所有脚本正常运行拷贝到老师机器后执行报错“找不到服务器 XXXXX”或“无法打开文件 C:\Users\myhome...”。原因脚本里包含了写死的计算机名、实例名、绝对路径。老师的机器实例名可能是localhost\SQLEXPRESS你的机器可能是DESKTOP-ABCD123\SQLEXPRESS备份还原语句里写到/Users/你的名字/那一台机器上没有这个目录直接失败。解决初始化脚本里避免写服务器名所有连接都使用(local)或.如果脚本必须在 SSMS 里手动执行在脚本顶部加注释说明“本脚本需在目标实例的 master 库上执行”。备份还原路径尽量只写相对路径或提示用户在本地修改。一个更保险的做法是把建库、建表、插入和查询脚本拆成四个.sql文件并在报告附件的说明文档里写清执行顺序1_create_database.sql -- 建库 2_create_tables.sql -- 建表 3_insert_data.sql -- 插入测试数据 4_query_and_demo.sql -- 查询、视图、存储过程、事务附件包命名也要规范比如StudentCourse_实验代码目录下放sql子目录和screenshots子目录。老师拿到包后按顺序执行能复现才叫合格交付。我见过不少人把所有语句混在一个文件里中途报错后不知道怎么继续最后报告里的截图和实际库对不上直接被怀疑造假这是最惨的翻车方式。6. 让实验报告长出“性能分析”的进阶做法执行计划与统计时间如果前面的内容都做完了实验报告的框架已经很完整。但想拿高分老实说光靠截图不够得展示你理解 SQL Server 是怎么执行你的查询的。这一章教一个最容易上手又百试不爽的技巧用统计信息和执行计划证明你的查询“为什么快”。先给查询加一个“体检”开关。在查询窗口顶部执行SET STATISTICS TIME ON; SET STATISTICS IO ON; GO SELECT s.StudentID, s.StudentName, c.CourseName, sc.Score FROM Students s JOIN SC sc ON s.StudentID sc.StudentID JOIN Courses c ON sc.CourseID c.CourseID WHERE c.CourseName N数据库原理;执行后消息栏会多出两块数据一是“CPU 时间 ... 占用时间 ...”的时间统计二是“逻辑读 5 次物理读 0 次”的 I/O 统计。逻辑读数字越小通常意味着扫描的数据页越少。把这组数字截图放报告里再对比加索引前后的差异。加一个覆盖查询的索引CREATE NONCLUSTERED INDEX IX_SC_CourseID_StudentID ON SC (CourseID, StudentID) INCLUDE (Score); GO重新执行同样查询观察逻辑读次数明显减少。实验报告里写“在 SC 表上按 CourseID 建立非聚集索引后查询某门课的学生名单时逻辑读从 18 次下降到 6 次避免了全表扫描。”这才叫性能分析而不是空喊“索引能加速”。答辩时老师问“你见过聚集索引扫描吗”可以直接把执行计划里的图标截图拿来说如果SELECT左侧图标显示聚集索引扫描 (Clustered Index Scan)说明它在逐页扫全表如果换成聚集索引查找 (Clustered Index Seek)或者索引查找 (Index Seek)说明走的索引下探。实验报告可以只用一句话解释区别扫描是把索引底层所有叶子节点看一遍查找是根据条件直接定位到记录查询范围越小查找越占优。我自己的习惯是每次交作业前把初始化脚本、测试数据、备份文件放到一个“提交包”文件夹里然后开一台干净虚拟机从零跑一遍所有脚本确认截图和数据完全对得上再提交。这个习惯帮我躲过几次现场演示失败也让报告里的每一张结果图都有底气。希望这个过程中的环境和代码细节也能帮你少走几步弯路希望帮到你。本文还有配套的精品资源点击获取
返回列表