数据库实验10

news2025/5/11 11:41:09
设计性实验

1.实验要求

1.编写函数FsumXXX,1~n(参数)求和;
GO
CREATE FUNCTION Fsum065 (@n INT)
RETURNS INT
AS
BEGIN
DECLARE @sum INT = 0
WHILE @n > 0
BEGIN
SET @sum = @sum + @n
SET @n = @n - 1
END
RETURN @sum
END
GO
在这里插入图片描述

– 调用
SELECT DBO.Fsum065(100) AS TotalSum;
在这里插入图片描述

2.编写函数FRANKXXX,参数为学号,返回该生平均分班级排名;
– 调用
SELECT DBO.Fsum065(100) AS TotalSum;

GO
CREATE FUNCTION FRANK065 (@sno CHAR(3))
RETURNS INT
AS
BEGIN
DECLARE @rank INT

SELECT @rank = rnk
FROM (
    SELECT Sno, RANK() OVER (ORDER BY AVG(Degree) DESC) AS rnk
    FROM Score065
    GROUP BY Sno
) AS RankedStudents
WHERE Sno = @sno

RETURN @rank

END
GO

– 调用
SELECT DBO.FRANK065(‘S001’) AS Rank;

3.编写函数FCJAXXX,参数为姓名或姓名一部分,返回该生的所有课程的成绩(学号,姓名,课程名,成绩等级);
选修成绩等级 A:90~100 B:80~90 C: 70~80 D:60~70 E:<60
GO
CREATE FUNCTION FCJA065 (@name NVARCHAR(10))
RETURNS TABLE
AS
RETURN (
SELECT
S.Sno,
S.Sname,
C.Cname,
SC.Degree,
CASE
WHEN SC.Degree < 60 THEN ‘E’
WHEN SC.Degree BETWEEN 60 AND 69 THEN ‘D’
WHEN SC.Degree BETWEEN 70 AND 79 THEN ‘C’
WHEN SC.Degree BETWEEN 80 AND 89 THEN ‘B’
WHEN SC.Degree BETWEEN 90 AND 100 THEN ‘A’
END AS GradeLevel
FROM student065 S
JOIN Score065 SC ON S.Sno = SC.Sno
JOIN Course065 C ON SC.Cno = C.Cno
WHERE S.Sname LIKE ‘%’ + @name + ‘%’
)
GO

– 调用
SELECT * FROM DBO.FCJA065(‘曾华庆’);
在这里插入图片描述

4.编写函数FclassXXX,参数为班级,返回该班男、女生平均分前二名 (学号,姓名,课程名,成绩,平均)
GO
CREATE FUNCTION Fclass065 (@classname CHAR(5))
RETURNS TABLE
AS
RETURN (
SELECT *
FROM (
SELECT
S.Sno,
S.Sname,
C.Cname,
SC.Degree,
AVG(SC.Degree) OVER(PARTITION BY S.Sno) AS AvgScore,
ROW_NUMBER() OVER(PARTITION BY S.Ssex ORDER BY AVG(SC.Degree) DESC) AS rn
FROM student065 S
JOIN Score065 SC ON S.Sno = SC.Sno
JOIN Course065 C ON SC.Cno = C.Cno
WHERE S.Class = @classname
GROUP BY S.Sno, S.Sname, S.Ssex, C.Cname, SC.Degree
) AS Ranked
WHERE rn <= 2
)
GO

– 调用
SELECT * FROM DBO.Fclass065(‘软件工程1班’);
在这里插入图片描述

  1. 修改表courseXXX ,增加两列,课程选修最大人数(mn ,默认50)和当前人数(cn ,默认0);
    ALTER TABLE Course065 ADD mn INT DEFAULT 50, cn INT DEFAULT 0;
    6.选课存储过程csXXX:
    –某学生没有选过某课程,要选某课程时,当没有超过课程最大人数时,可以选择该课程,当前选课人数加1, 并在成绩score表中增加对应的该生该课程的成绩为0记录
    –否则,提示该课程选课人数已满!
    EXEC csXXX 学号 , 课程号
    – 调用
    SELECT * FROM DBO.Fclass065(‘软件工程1班’);

ALTER TABLE Course065
ADD mn INT DEFAULT 50,
cn INT DEFAULT 0;

GO
CREATE PROCEDURE cs065 @sno CHAR(3), @cno CHAR(5)
AS
BEGIN
IF EXISTS (SELECT 1 FROM Score065 WHERE Sno = @sno AND Cno = @cno)
BEGIN
PRINT ‘该学生已选修此课程’
RETURN
END

DECLARE @current INT
SELECT @current = cn FROM Course065 WHERE Cno = @cno

IF @current >= 50
BEGIN
    PRINT '该课程人数已满'
    RETURN
END

UPDATE Course065 SET cn = cn + 1 WHERE Cno = @cno
INSERT INTO Score065(Sno, Cno, Degree) VALUES (@sno, @cno, 0)
PRINT '选课成功'

END
GO

– 示例调用
EXEC cs065 ‘S002’, ‘C001’;
在这里插入图片描述

7.退选课程CSDXXX
某学生选了某课程后,要退选,该课程的当前选课人数减1,并删除其对应的成绩。
EXEC csdXXX 学号 , 课程号
– 示例调用
EXEC cs065 ‘S002’, ‘C001’;

GO
CREATE PROCEDURE csd065 @sno CHAR(3), @cno CHAR(5)
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM Score065 WHERE Sno = @sno AND Cno = @cno)
BEGIN
PRINT ‘该学生未选修此课程’
RETURN
END

DELETE FROM Score065 WHERE Sno = @sno AND Cno = @cno
UPDATE Course065 SET cn = cn - 1 WHERE Cno = @cno
PRINT '退选成功'

END
GO

– 示例调用
EXEC csd065 ‘S002’, ‘C001’;
在这里插入图片描述

8… 查询学生成绩cxXXX
某学生选了某课程后, 可以查询其成绩(out)
EXEC cxXXX 学号 , 课程号
GO
CREATE PROCEDURE cx065 @sno CHAR(3), @cno CHAR(5), @degree DECIMAL(5,1) OUTPUT
AS
BEGIN
SELECT @degree = Degree FROM Score065 WHERE Sno = @sno AND Cno = @cno
IF @@ROWCOUNT = 0
BEGIN
PRINT ‘未找到该学生的成绩记录’
RETURN
END
END
GO

– 调用
DECLARE @score DECIMAL(5,1)
EXEC cx065 ‘S001’, ‘C001’, @score OUTPUT
SELECT @score AS Score;

思考题

(1)什么标量函数和表值函数?
标量函数返回的是单个值,即返回一个数字或者字符串
表值函数返回的是表的结构,一般是多行数据
(2)函数定义和调用应注意哪些事项?
必须使用 DBO. 前缀调用用户自定义函数;
函数不能修改数据库状态(如插入、更新);
参数类型要匹配;
避免在函数中使用 PRINT,应尽量只返回值。
(3)定义存储过程有哪些选项?分别表示什么意思
@parameter OUTPUT:用于返回值;
SET NOCOUNT ON:禁止显示影响行数的消息;
RAISERROR():抛出错误信息;
IF @@ROWCOUNT = 0:判断是否影响了行;
支持事务控制(BEGIN TRANSACTION, COMMIT, ROLLBACK);

实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)

通过本次数据库实验——函数与存储过程的设计与实现,我对 SQL Server 中程序化对象的使用有了更加深入的理解和实践。
在实验过程中,我从最基础的函数编写开始,逐步掌握了如何将一些重复性的业务逻辑封装成函数。比如,在编写 FMax065 和 Fc065 这样的标量函数时,我学会了如何处理输入参数、进行条件判断,并返回一个确定的值;而在编写如 Fsc065 和 FCJA065 这类表值函数时,我理解了函数不仅可以返回单个值,还可以返回整个结果集。
随后,在存储过程部分,我尝试将更复杂的业务逻辑(如成绩统计、选课控制)封装到存储过程中。例如,printcourse065 要求我对成绩进行分段统计并更新临时表,这个过程中我学习到了如何使用变量、条件分支以及动态更新数据。而 cs065 和 csd065 两个选课/退选的存储过程则让我意识到,实际系统中需要考虑并发控制、状态一致性等问题,比如当前课程是否已满、学生是否已经选过该课程等边界情况,这些都需要在设计时充分考虑。
在完成设计性实验的过程中,我也遇到了不少挑战。甚至还有一些没有解决的问题,如在设计性实验中返回该生平均分和班级排名时返回的是一个空值,这肯定是不对的,还有就是当创建函数后发现函数内部的值有问题但是又不能直接重新再创建一遍时该怎么处理会比较合适?对于 cs065 存储过程,如果多个用户同时尝试选同一门课,会不会出现并发冲突?有没有更好的方式来保证选课人数的准确性?这让我明白了:SQL 不只是写出来就能运行,更重要的是逻辑正确、效率合理。数据库不仅仅是建表和查询,更是工程化的系统设计。它涉及事务、锁、索引、并发控制等多个方面,这些内容虽然我现在还不能完全掌握,但已经激发了我进一步学习的兴趣。
总的来说,这次实验让我认识到自己在数据库编程方面的不足。我希望未来能继续深入学习 T-SQL 高级特性,比如游标、触发器、事务控制等,争取写出更专业、更健壮的数据库程序。同时,也希望自己能在今后的学习和项目中,把今天学到的知识应用得更好,真正做到学以致用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jflash下载时出现 Could not read unit serial number! 的解决方法

出现的原因是由于Jlink原厂固件SN码是-1 我用的版本是v6.40 解决方法&#xff1a;添加序列号 1.打开&#xff1a;J-Link commander 之后在命令栏输入&#xff1a;exec setsnxxxxxxxx 2.添加序列号到license&#xff0c;打开J-Link License Manager V6.40 jlink-v640下载软件…

Linux 信号终篇(总结)

前文&#xff1a;本文是对信号从产生到被处理的过程中的概念和原理的总结&#xff0c;如果想了解具体实现&#xff0c;请查看前两篇博客&#xff1a;Linux 信号-CSDN博客、Linux 信号&#xff08;下篇&#xff09;-CSDN博客 一、信号的产生 1.1 信号产生的五种条件 ①键盘组…

LVGL对象(Objects)

文章目录 &#x1f9f1; 一、LVGL 中的对象&#xff08;lv\_obj&#xff09;&#x1f539; lv\_obj\_t 的作用 &#x1f9e9; 二、对象的分类结构&#xff08;类比继承&#xff09;&#x1f9f0; 三、对象的创建与销毁✅ 创建对象示例&#xff1a;创建一个按钮❌ 删除对象 &…

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?

SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型‌ 弱加密算法与密钥问题‌ 使用弱密码套件&#xff08;如DES、RC4&#xff09;或密钥长度不足&#xff08;如RSA密钥长度<2048位&#xff09;&#xff0c;导致加密强度不足。 密钥管理不当&#xff08;如私钥未加密存…

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…

C++修炼:stack和queue

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术

优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…

软考错题集

一个有向图具有拓扑排序序列&#xff0c;则该图的邻接矩阵必定为&#xff08;&#xff09;矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素&#xff0c;而其余部分为零。一般矩阵这个术语太过宽泛&#xff0c;不具体指向任何特定性 质的矩阵。对称矩阵…

T2I-R1:通过语义级与图像 token 级协同链式思维强化图像生成

文章目录 速览摘要1 引言2 相关工作统一生成与理解的 LMM(Unified Generation and Understanding LMM.)用于大型推理模型的强化学习(Reinforcement Learning for Large Reasoning Models.)3 方法3.1 预备知识3.2 语义级与令牌级 CoT语义级 CoT(Semantic-level CoT)令牌级…

Dockers部署oscarfonts/geoserver镜像的Geoserver

Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话&#xff0c;最后发现要选择合适的Geoserver镜像才是关键&#xff0c;所以所以所以…&#x1f437; 推荐oscarfonts/geoserver的镜像&#xff01; 一开始用kartoza/geoserver镜像一直提示内存不足&#xff0c;不过还好…

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…

【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【MySQL】存储引擎 - ARCHIVE、BLACKHOLE、MERGE详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

代码随想录第41天:图论2(岛屿系列)

一、岛屿数量&#xff08;Kamacoder 99&#xff09; 深度优先搜索&#xff1a; # 定义四个方向&#xff1a;右、下、左、上&#xff0c;用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…

VUE CLI - 使用VUE脚手架创建前端项目工程

前言 前端从这里开始&#xff0c;本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备&#xff08;编辑器和管理器&#xff09; 编辑器&#xff1a;推荐使用Vscode&#xff0c;WebStorm&#xff0c;或者Hbuilder&#xff08;适合刚开始练手使用&#xff09;&#xff0c;个…

Java EE初阶——初识多线程

1. 认识线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 基本概念&#xff1a;一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;如内存空间、文件描述符等&#xff0c;但每个线程都有自己独…

如何删除网上下载的资源后面的文字

这是我在爱给网上下载的音效资源&#xff0c;但是发现资源后面跟了一大段无关紧要的文本&#xff0c;但是修改资源名称后还是有。解决办法是打开属性然后删掉资源的标签即可。

FPGA图像处理(5)------ 图片水平镜像

利用bram形成双缓冲&#xff0c;如下图配置所示&#xff1a; wr_flag 表明 buffer0写 还是 buffer1写 rd_flag 表明 buffer0读 还是 buffer1读 通过写入逻辑控制(结合wr_finish) 写哪个buffer &#xff1b;写地址 进而控制ip的写使能 通过状态缓存来跳转buffer的…

day21python打卡

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 还有一些其他的降维方式&#xff0c;也就是最重要的词向量的加工&#xff0c;我们未来再说 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让ai给你出题&…

ERP学习(一): 用友u8安装

安装&#xff1a; https://www.bilibili.com/video/BV1Pp4y187ot/?spm_id_from333.337.search-card.all.click&vd_sourced514093d85ee628d1f12310b13b1e59b 我个人用vmware16&#xff0c;这位up已经把用友软件和环境&#xff08;sqlserver2008&#xff09; 都封城vmx文件了…