20260626

发布时间:2026/6/26 1:21:21

20260626 1第三章-文件组1使用Transact-SQL语句在SQL Server 2016实例上创建一个数据库该数据库包括一个主数据文件、一个用户定义文件组和一个日志文件主数据文件在主文件组中而用户定义文件组包含两个次要数据文件。数据库名称为你的试卷代号学号后4位该数据库的主数据文件逻辑名称为student_data物理文件名为student.mdf初始大小为8MB最大尺寸为无限大增长速度为30%数据库的日志文件逻辑名称为student_log物理文件名为student.ldf初始大小为4MB最大尺寸为40MB增长速度为2MB。用户定义文件组名称为你的试卷代号学号后2位包含的两个次要数据文件名分别为Data1和Data2它们的初始大小都为6MB最大尺寸都为20MB增长速度都为2MB。要求该数据库主数据文件、两个次要数据文件以及日志文件的物理文件都存放在d:\sql文件夹下。10分CREATE DATABASE KS011234ON PRIMARY(NAME student_data,FILENAME d:\sql\student.mdf,SIZE 8MB,MAXSIZE UNLIMITED,FILEGROWTH 30%),FILEGROUP KS0134(NAME Data1,FILENAME d:\sql\Data1.ndf,SIZE 6MB,MAXSIZE 20MB,FILEGROWTH 2MB),(NAME Data2,FILENAME d:\sql\Data2.ndf,SIZE 6MB,MAXSIZE 20MB,FILEGROWTH 2MB)LOG ON(NAME student_log,FILENAME d:\sql\student.ldf,SIZE 4MB,MAXSIZE 40MB,FILEGROWTH 2MB);(2)使用 Transact-SQL 语句在前面创建的数据库中创建 s 表和 sc 表表结构如下10 分S表列名 数据类型及长度 是否为空 备注studentno nchar(11) 否 主键sname nchar(8) 否sc表列名 数据类型及长度 是否为空 备注studentno nchar(11) 否 主键courseno nchar(6) 否final numeric(6,2) 否-- 切换数据库 USE 你的数据库名;GO-- 创建学生表 sCREATE TABLE s(studentno NCHAR(11) NOT NULL PRIMARY KEY, -- 主键非空sname NCHAR(8) NOT NULL -- 姓名非空 );GO-- 创建成绩表 scCREATE TABLE sc ( studentno NCHAR(11) NOT NULL,courseno NCHAR(6) NOT NULL,final NUMERIC(6,2) NOT NULL, -- 联合主键学号课程号PRIMARY KEY (studentno, courseno),-- 外键约束关联学生表FOREIGN KEY (studentno) REFERENCES s(studentno) );GO3第四章 -- 约束(3)使用 Transact-SQL 语句对 sc 表增加约束进一步要求学生的期末成绩final字段取值在 0~100 之间。10 分-- 切换到你的数据库 USE 你的数据库名;GO --给sc表添加检查约束限制成绩0~100ALTER TABLE scADD CONSTRAINT CK_sc_finalCHECK (final 0 AND final 100);GO4第四章 insert (4) 使用 Transact-SQL 语句向 s 表和 sc 表添加以下记录。10 分s表studentno sname15122210009 张三15122211324 李四sc表studentno courseno final15122210009 C05103 87.0015122210009 C05109 77.0015122211324 C05103 50.0015122211324 C05109 70.00-- 切换到你的数据库USE 你的数据库名;GO-- 1. 向s学生表插入2条学生数据INSERT INTO s(studentno, sname)VALUES(15122210009, N张三),(15122211324, N李四);GO-- 2. 向sc成绩表插入4条成绩数据INSERT INTO sc(studentno, courseno, final)VALUES(15122210009, C05103, 87.00),(15122210009, C05109, 77.00),(15122211324, C05103, 50.00),(15122211324, C05109, 70.00);GO5第五章 - 控制流语句 case(5) 使用 Transact-SQL 语句用 case 语句完成显示final 字段 90 分以上显示 A80 分以上显示 B70 分以上显示 C60 分以上显示 D其它显示 E。10 分USE 你的数据库名;GOSELECTstudentno,courseno,final,-- CASE 判断成绩等级CASEWHEN final 90 THEN AWHEN final 80 THEN BWHEN final 70 THEN CWHEN final 60 THEN DELSE EEND AS score_level -- 新增列名为score_level成绩等级FROM sc;GO6第八章 - 视图(6) 使用 Transact-SQL 语句在数据库中创建一个名为 V_final 的视图查询每门课最高分的课号和成绩。10 分- 切换数据库USE 你的数据库名;GO-- 创建视图V_finalCREATE VIEW V_finalASSELECTcourseno AS 课程号,MAX(final) AS 最高分FROM scGROUP BY courseno;GO-- 查看视图结果SELECT * FROM V_final;第七章 -- 游标(7) 使用游标显示表 sc 中所有 16 级即 studentno 以 16 开头学生的所有选修信息格式如下。10 分标题16 级学生选修信息 列学号、课程号、成绩USE 你的数据库名;GO-- 1. 声明变量接收游标每行数据DECLARE studentno NCHAR(11),courseno NCHAR(6),final NUMERIC(6,2);-- 2. 声明游标筛选学号以16开头的记录DECLARE cur_16stu CURSORFORSELECT studentno, courseno, finalFROM scWHERE studentno LIKE 16%;-- 3. 打开游标OPEN cur_16stu;-- 4. 读取第一行数据FETCH NEXT FROM cur_16stu INTO studentno, courseno, final;-- 打印表头PRINT 16级学生选修信息;PRINT 学号 课程号 成绩;PRINT ----------------------------------------;-- 5. 循环遍历游标所有行WHILE FETCH_STATUS 0BEGIN-- 格式化输出每行信息PRINT | CAST(studentno AS VARCHAR) | CAST(courseno AS VARCHAR) | CAST(final AS VARCHAR) |;-- 读取下一条FETCH NEXT FROM cur_16stu INTO studentno, courseno, final;ENDPRINT ----------------------------------------;-- 6. 关闭、释放游标资源CLOSE cur_16stu;DEALLOCATE cur_16stu;GO8第九章 -- 存储过程(8) 使用 Transact-SQL 语句在前面创建的数据库上创建一个存储过程 ProcAvg对指定 “Courseno” 的课程求 final 平均成绩。“Courseno” 由输入参数给定计算出的平均成绩通过输出参数返回。若该存储过程已存在则删除后重建。然后执行该存储过程显示 Courseno 为 C05103 课程的平均成绩。10 分-- 切换到你的数据库USE 你的数据库名;GO-- 如果存储过程ProcAvg存在先删除IF EXISTS (SELECT * FROM sys.procedures WHERE name ProcAvg)DROP PROCEDURE ProcAvg;GO-- 创建存储过程ProcAvgCREATE PROCEDURE ProcAvgin_courseno NCHAR(6), -- 输入参数课程号avg_score NUMERIC(6,2) OUTPUT -- 输出参数课程平均分ASBEGINSET NOCOUNT ON;-- 根据输入课程号计算平均分并赋值给输出参数SELECT avg_score AVG(final)FROM scWHERE courseno in_courseno;ENDGO-- 调用存储过程查询课程C05103平均分DECLARE result NUMERIC(6,2); -- 定义变量接收输出值EXEC ProcAvg in_courseno C05103, avg_score result OUTPUT;-- 打印结果PRINT 课程C05103的平均成绩 CAST(result AS VARCHAR(10));9第九章 -- 触发器(9) 使用 Transact-SQL 语句创建一个 AFTER 触发器要求实现以下功能当用户删除 s 表一条学生记录时触发器自动删除 sc 表中该学生的选课信息。10 分USE 你的数据库名;GO-- 如果触发器已存在先删除避免报错IF EXISTS (SELECT * FROM sys.triggers WHERE name trg_del_stu)DROP TRIGGER trg_del_stu;GO-- 在s表创建AFTER DELETE触发器CREATE TRIGGER trg_del_stuON sAFTER DELETEASBEGINSET NOCOUNT ON;-- 从sc表删除和被删除学生学号匹配的选课记录DELETE scFROM scINNER JOIN deleted ON sc.studentno deleted.studentno;ENDGO10第七九章 -- 游标加存储过程(10) 使用 Transact-SQL 语句在 s 表中增加一个课程通过门数字段课程期末成绩final 字段在 60 分及以上为通过使用游标编写存储过程再调用存储过程将每个同学的课程通过门数自动正确填入 s 表。最后查询验证每位学生的课程通过门数已正确填入。10 分USE 你的数据库名;GO-- 在学生表s新增pass_count字段记录通过课程数量ALTER TABLE sADD pass_count INT DEFAULT 0;GO-- 如果存储过程存在先删除IF EXISTS (SELECT * FROM sys.procedures WHERE name CalcPassCount)DROP PROCEDURE CalcPassCount;GOCREATE PROCEDURE CalcPassCountASBEGINSET NOCOUNT ON;-- 声明变量存储学号DECLARE stu_no NCHAR(11);-- 声明游标遍历s表所有学生学号DECLARE stu_cur CURSORFOR SELECT studentno FROM s;-- 打开游标OPEN stu_cur;FETCH NEXT FROM stu_cur INTO stu_no;-- 循环读取每个学生WHILE FETCH_STATUS 0BEGIN-- 计算当前学生final60的课程门数更新到s表pass_countUPDATE sSET pass_count (SELECT COUNT(*) FROM scWHERE sc.studentno s.studentno AND final 60)WHERE studentno stu_no;-- 读取下一位学生FETCH NEXT FROM stu_cur INTO stu_no;END-- 释放游标资源CLOSE stu_cur;DEALLOCATE stu_cur;ENDGOEXEC CalcPassCount;GO-- 查询学生学号、姓名、通过课程门数验证SELECT studentno AS 学号, sname AS 姓名, pass_count AS 课程通过门数FROM s;GO

相关新闻