MySql存储过程循环使用的方法

场景描述

我们举一个简单的场景,首先我们可能会有这样一种情况,考试成绩表(t_achievement)有一堆的sql脚本处理,需要依赖另一个学生表(t_student)数据对部分学生做考试成绩汇总记录到成绩汇总表(t_achievement_report)。

解决方案

有一种方式就是通过代码优先将要汇总的学生表数据获取出来,然后按成绩汇总流程逐个将学生信息数据传递到成绩汇总业务代码进行处理。

另一种方式也是我们今天的主题,那就是通过存储过程的方式去做。

案例

建表语句:

-- 学生信息表DROP TABLE IF EXISTS t_student;CREATE TABLE `t_student` (  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键',  `code` VARCHAR(10) NOT NULL COMMENT '学号',  `name` VARCHAR(20) NOT NULL COMMENT '姓名',  `age` INT(2) NOT NULL COMMENT '年龄',  `gender` CHAR(1) NOT NULL COMMENT '性别(M:男,F:女)',  PRIMARY KEY (`id`),  UNIQUE KEY UK_STUDENT (`code`)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 学生成绩表DROP TABLE IF EXISTS t_achievement;CREATE TABLE `t_achievement` (  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键',  `year` INT(4) NOT NULL COMMENT '学年',  `subject` CHAR(2) NOT NULL COMMENT '科目(01:语文,02:数学,03:英语)',  `score` INT(3) NOT NULL COMMENT '得分',  `student_id` BIGINT(12) NOT NULL COMMENT '所属学生id',  PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 成绩汇总表DROP TABLE IF EXISTS t_achievement_report;CREATE TABLE `t_achievement_report` (  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键',  `student_id` BIGINT(12) NOT NULL COMMENT '学生id',  `year` INT(4) NOT NULL COMMENT '学年',  `total_score` INT(4) NOT NULL COMMENT '总分',  `avg_score` DECIMAL(4,2) NOT NULL COMMENT '平均分',  PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

初始化数据:

INSERT INTO t_student(id, CODE, NAME, age, gender) VALUES(1, '2022010101', '小张', 18, 'M'),(2, '2022010102', '小李', 18, 'F'),(3, '2022010103', '小明', 18, 'M');INSERT INTO t_achievement(YEAR, SUBJECT, score, student_id) VALUES(2022, '01', 80, 1),(2022, '02', 85, 1),(2022, '03', 90, 1),(2022, '01', 60, 2),(2022, '02', 90, 2),(2022, '03', 98, 2),(2022, '01', 75, 3),(2022, '02', 100, 3),(2022, '03', 85, 3);

MySql存储过程循环使用的方法

MySql存储过程循环使用的方法

存储过程:

在这里主要以上面的场景为例,使用存储过程循环去处理数据。写一个存储过程,将以上数据每个学生的成绩进行汇总。

-- 如果存储过程存在,先删除存储过程DROP PROCEDURE IF EXISTS statistics_achievement;DELIMITER $$-- 定义存储过程CREATE PROCEDURE statistics_achievement()BEGIN        -- 定义变量记录循环处理是否完成DECLARE done BOOLEAN DEFAULT FALSE;        -- 定义变量传递学生idDECLARE studentid BIGINT(12);-- 定义游标DECLARE cursor_student CURSOR FOR SELECT id FROM t_student;-- 定义CONTINUE HANDLER,当循环结束时 done=trueDECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;-- 打开游标OPEN cursor_student;-- 重复遍历REPEAT -- 每次读取一次游标FETCH cursor_student INTO studentid;                -- 计算总分、平均分插入汇总表INSERT INTO t_achievement_report(student_id, `YEAR`, total_score, avg_score)SELECT studentid, `YEAR`, SUM(score), ROUND(SUM(score) / 3, 2) FROM t_achievement t1 WHERE student_id = studentid AND NOT EXISTS(SELECT 1 FROM t_achievement_report t2 WHERE student_id = studentid AND t1.year = t2.year) GROUP BY `YEAR`;-- 结束循环,意思是等到done=true时,结束循环REPEATUNTIL done END REPEAT;-- 查询结果,仅会展示查出的最后一条SELECT studentid;-- 关闭游标CLOSE cursor_student;END$$DELIMITER ;
-- 执行存储过程CALL statistics_achievement();

执行结果,返回查询结果3,即最后一条学生记录id

MySql存储过程循环使用的方法

MySql存储过程循环使用的方法

以上就是MySql存储过程循环使用的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/163867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2026年8月26日 04:23:00
c语言编程中debug什么意思
下一篇 2025年12月17日 14:19:24

相关推荐

  • MYSQL大表改字段慢问题如何解决

    对大型表而言,mysql的alter table操作的性能会成为一个显著的挑战。mysql执行大部分修改表结构操作的方法是用新的表结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。如果内存不足且表很大,同时还有很多索引,那么这种操作可能会非常耗时。alter table操作通常需要几个小…

    用户投稿 2026年8月26日
    000
  • 告别递归查询噩梦:如何使用previousnext/nested-set和Composer优雅管理PHP树形数据

    可以通过一下地址学习composer:学习地址 树形数据的烦恼:传统方法为何力不从心? 相信很多 php 开发者都遇到过这样的场景:你需要在一个数据库中存储具有层级关系的数据,比如一个多级分类系统、一个文件目录结构,或者一个组织内的部门层级。最直观的实现方式,莫过于在每个记录中添加一个 parent…

    用户投稿 2026年8月26日
    000
  • PHP数据更新怎么实现_PHPMySQL数据更新操作方法指南

    答案:使用预处理语句可有效防止SQL注入。通过将SQL结构与数据分离,数据库先解析语句结构,再绑定用户输入作为纯值处理,避免其被当作代码执行,从而杜绝注入风险,是安全更新数据的核心方法。 PHP更新MySQL数据,核心在于构建正确的SQL UPDATE语句,并借助mysqli或PDO这类数据库扩展安…

    2026年8月26日
    000
  • MySQL怎样正确使用事务处理 事务隔离级别与并发控制实践

    MySQL怎样正确使用事务处理 事务隔离级别与并发控制实践MySQL怎样正确使用事务处理 事务隔离级别与并发控制实践MySQL怎样正确使用事务处理 事务隔离级别与并发控制实践MySQL怎样正确使用事务处理 事务隔离级别与并发控制实践

    正确使用mysql事务需确保acid特性,通过start transaction开启事务,commit提交或rollback回滚操作,避免部分执行导致数据不一致;2. 事务隔离级别有四种:read uncommitted允许脏读,极少使用;read committed解决脏读但存在不可重复读,适用于…

    2026年8月26日 用户投稿
    000
  • 在MySQL存储过程中怎么使用if嵌套语句

    一、if语句介绍 if语句是一种分支结构语句,根据条件执行不同的操作。if语句通常由一个条件表达式和一条或多条语句组成。执行if语句中的语句的前提是条件表达式的值为真,否则将跳过if语句块。 if语句的语法如下: if(condition)then statement;else statement;…

    用户投稿 2026年8月26日
    000
  • Linux下怎么使用mysql命令导入、导出sql文件

    日常开发的时候,避免不了进行数据库的导入导出操作。 直接使用命令: mysqldump -u root -p abc >abc.sql 然后回车输入密码就可以了; mysqldump -u 数据库链接用户名 -p  目标数据库 > 存储的文件名 文件会导出到当前目录下 导入数据库(sql…

    2026年8月26日
    100
  • MySQL Replication中并行复制怎么实现

    传统单线程复制说明 众所周知,MySQL在5.6版本之前,主从复制的从节点上有两个线程,分别是I/O线程和SQL线程。 i/o线程负责接收二进制日志的event写入relay log。 SQL线程读取Relay Log并在数据库中进行回放。 以上方式偶尔会造成延迟,那么可能造成主从节点延迟的情况有哪…

    用户投稿 2026年8月26日
    000
  • 数据库MySQL性能优化与复杂查询相关的操作方法有哪些

    索引的优化 索引是 mysql 中用于加快查询速度的关键。若索引设计得当,能有效提升查询效率;相反,若设计不当,查询效率可能会受到影响。 下面是一些常见的索引优化技巧: 使用更少的索引,避免创建过多的索引,因为创建索引会降低写入性能。 选择合适的数据类型,例如使用整数类型的主键和外键,比使用 UUI…

    用户投稿 2026年8月26日
    100
  • CentOS 6.5下怎么快速安装MySQL 5.7.17

    1.下载安装包 从mysql官网上下载最新的mysql安装包mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 注意,一定要下载.tar.gz,不要下载那个.tar的包 将安装包上传到/opt目录下: 2.检查库文件是否存在,如果存在则删除 [root@host-17…

    2026年8月26日
    000
  • linux下Vps自动备份web和mysql数据库的脚本怎么写

    一、备份web文件夹1、备份/home/users/public_html目录2、修改crontab为每周第一天3:22时运行 复制代码 代码如下: 22 3 * * 0 root run-parts /etc/cron.weekly 3、复制脚本到/etc/cron.weekly目录4、修改权限 …

    用户投稿 2026年8月26日
    100
  • MySQL使用ReplicationConnection导致连接失效怎么解决

    MySQL使用ReplicationConnection导致连接失效怎么解决MySQL使用ReplicationConnection导致连接失效怎么解决MySQL使用ReplicationConnection导致连接失效怎么解决MySQL使用ReplicationConnection导致连接失效怎么解决

    引言 mysql数据库读写分离,是提高服务质量的常用手段之一,而对于技术方案,有很多成熟开源框架或方案,例如:sharding-jdbc、spring中的abstractroutingdatasource、mysql-router等,而mysql-jdbc中的replicationconnectio…

    2026年8月26日 用户投稿
    100
  • Swoole在高并发下的连接数优化

    swoole在高并发下的连接数优化可以通过以下步骤实现:1. 合理配置swoole参数,如reactor_num、worker_num和max_connection。2. 代码层面避免阻塞操作,使用协程技术。3. 使用连接池减少连接开销。4. 关注内存管理,避免内存泄漏。5. 进行性能监控和调优,以…

    2026年8月25日
    000
  • MySQL中的逻辑备份怎么实现

    说明 1、MySQL中的逻辑备份是将数据库中的数据备份为一个文本文件,备份的文件可以被查看和编辑。 2、可以使用mysqldump工具来完成逻辑备份。 如果没有指定数据库中的任何表,默认导出所有数据库中的所有表。 实例 // 备份指定的数据库或者数据库中的某些表 shell> mysqldum…

    用户投稿 2026年8月25日
    000
  • Spring如何连接Mysql数据库

    Spring如何连接Mysql数据库Spring如何连接Mysql数据库Spring如何连接Mysql数据库Spring如何连接Mysql数据库

    一、创建一个Maven项目 二、导入坐标  在pom.xml加入如下坐标,并且点击右上角刷新。 org.springframework spring-context 5.3.15 org.springframework spring-jdbc 5.3.15 mysql mysql-connector…

    2026年8月25日 用户投稿
    100
  • 怎么使用PHP连接MySql数据库

    在使用此类之前,可以普及两点知识: PHP中使用静态的调用,不同于其他编程语言,它的静态调用为: 类名::$静态属性类名::静态方法() 而Java、C#等编程语言都是通过: 类名.静态属性 类名.静态方法() 立即学习“PHP免费学习笔记(深入)”; 静态方法的优点: (1)在代码的任何地方都可以…

    2026年8月25日
    100
  • MySQL中有哪些数据查询语句

    一、基本概念(查询语句) ①基本语句 1、“select * from 表名;”,—可查询表中全部数据;2、“select 字段名 from 表名;”,—可查询表中指定字段的数据;3、“select distinct 字段名 from 表名;”,—可对表中数据进行去重查询。4、“select 字段名…

    用户投稿 2026年8月25日
    000
  • MySQL中HOUR函数怎么用

    HOUR(time) SELECT HOUR(‘11:22:33′) SELECT HOUR(‘2016-01-16 11:22:33′) -> 11-> 11 返回该date或者time的hour值,值范围(0-23) 以上就是MySQL中HOUR函数怎么用的详细内容,更多请关注创想鸟…

    用户投稿 2026年8月25日
    100
  • MySQL常用函数是什么

    MySQL常用函数是什么MySQL常用函数是什么MySQL常用函数是什么MySQL常用函数是什么

    MySQL常用函数 一、数字函数 附加:ceil(x) 如ceil(1.23) 值为2 可以写成ceiling(x) 二、字符串函数 划线就是常用的(取字节数) 附加:char_length字符 (查询名字后三位数的) 如:char_length(name)=3 可写成: select left(n…

    2026年8月25日 用户投稿
    100
  • Mac系统中忘记MySQL密码怎么解决

    在解决MySQL密码问题之前,我们需要掌握MySQL在Mac系统中安装所在的目录。通常情况下,我们可以在以下路径中找到MySQL的安装目录: /usr/local/mysql 接着,打开终端,进入MySQL的bin目录,执行以下命令: cd /usr/local/mysql/bin 现在,我们可以通…

    用户投稿 2026年8月25日
    000
  • MySQL中MINUTE函数怎么用

    MINUTE(time) SELECT MINUTE(‘11:22:33′) SELECT MINUTE(‘2016-01-16 11:44:33′) -> 22-> 44 返回该time的minute值,值范围(0-59) 以上就是MySQL中MINUTE函数怎么用的详细内容,更多请关…

    用户投稿 2026年8月25日
    500

发表回复

登录后才能评论
关注微信