需求:通过查询分数表统计成绩,并将统计好的成绩插入另一张表。

分数表(score)详细信息如下:

说明:分数表本应该引用课程id(course_id)作为外键,此处重点在于练习mysql的存储过程,为了能够直观的看到结果,所以此处使用课程名称作为分数表的列,也没有创建课程表(备注:测试数据只需保证课程名称不重复即可)。

DROP TABLE IF EXISTS `score`;CREATE TABLE `score` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`course_name` varchar(32) DEFAULT NULL,`student_num` int(11) DEFAULT NULL,`score` float DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;

分数表的部分数据,这些数据为测试数据方便确定结果。

成绩(统计)表:

该表为结果表,具体字段如下

DROP TABLE IF EXISTS `grades`;CREATE TABLE `grades` (`course_name` varchar(32) NOT NULL,`avg` float DEFAULT NULL,`min` float DEFAULT NULL,`max` float DEFAULT NULL,`lose` int(11) DEFAULT NULL,PRIMARY KEY (`course_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该表初始状态下为一张空表,用于保存存储过程执行后的数据,下图为存储过程执行完成后的结果图。

成绩表统计了课程的平均分(avg)、最低分(min)、最高分(max)以及不及格人数(lose)

(重点)创建存储过程

明确目的:通过创建存储过程,查询出各科目的平均分(avg)、最低分(min)、最高分(max)以及不及格人数(lose),并且插入到成绩表(grades)中。

-- 如果存在重名的存储过程 先删除后 再创建
DROP PROCEDURE IF EXISTS pro_test;DELIMITER $
-- 创建存储过程
CREATE PROCEDURE pro_test()
BEGIN-- 需要定义接收游标数据的变量 DECLARE done BOOLEAN DEFAULT 0;DECLARE v_avg FLOAT;-- 平均分DECLARE v_max INT;-- 最高分DECLARE v_min INT; -- 最低分DECLARE v_lose INT; -- 考试不及格的人数DECLARE v_courseName VARCHAR(32); -- 课程名称-- 定义游标DECLARE cur1 CURSOR FOR SELECT course_name, AVG(score) v_avg, MAX(score) v_max, MIN(score) v_min FROM score GROUP BY course_name;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;-- 使用任意一种方式定义都可以-- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;-- 打开游标OPEN cur1;-- 开始循环REPEATFETCH cur1 INTO v_courseName,v_avg,v_max,v_min;-- 判断是否读到游标末尾 如果不加这个条件 插入的数据会增多1条IF done <1 OR done >1 THEN-- 查询每个学科不及格人数      SELECT COUNT(1) INTO v_lose FROM score WHERE v_courseName = course_name AND score<60;   INSERT INTO grades VALUES(v_courseName,v_avg,v_max,v_min,v_lose);END IF;UNTIL done = 1END REPEAT;
-- 循环结束-- 关闭游标CLOSE cur1 ;
END $-- 清空结果表数据
TRUNCATE TABLE grades;-- 执行存储过程
CALL pro_test();SELECT * FROM grades;SELECT course_name, AVG(score) 'avg', MIN(score) 'min', MAX(score) 'max' FROM score GROUP BY course_name;

最后贴上全部sql

/*
SQLyog Ultimate v11.27 (32 bit)
MySQL - 5.7.28-log : Database - test
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `test`;/*Table structure for table `grades` */DROP TABLE IF EXISTS `grades`;CREATE TABLE `grades` (`course_name` varchar(32) NOT NULL,`avg` float DEFAULT NULL,`min` float DEFAULT NULL,`max` float DEFAULT NULL,`lose` int(11) DEFAULT NULL,PRIMARY KEY (`course_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `grades` *//*Table structure for table `score` */DROP TABLE IF EXISTS `score`;CREATE TABLE `score` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`course_name` varchar(32) DEFAULT NULL,`student_num` int(11) DEFAULT NULL,`score` float DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;/*Data for the table `score` */insert  into `score`(`id`,`course_name`,`student_num`,`score`) values (1,'H5前端',1,84),(2,'java基础',1,56),(3,'需求分析',1,42),(4,'大学英语',1,68),(5,'操作系统',1,56),(6,'编译原理',1,65),(7,'软件测试',1,34),(8,'Android',1,23),(9,'spring',1,78),(10,'mysql',1,96),(11,'vue.js',1,45),(12,'linux',1,96),(13,'hadoop',1,75),(14,'H5前端',2,52),(15,'java基础',2,54),(16,'需求分析',2,45),(17,'大学英语',2,68),(18,'操作系统',2,79),(19,'编译原理',2,35),(20,'软件测试',2,89),(21,'Android',2,55),(22,'spring',2,66),(23,'mysql',2,89),(24,'vue.js',2,87),(25,'linux',2,43),(26,'hadoop',2,90),(27,'H5前端',3,24),(28,'java基础',3,58),(29,'需求分析',3,30),(30,'大学英语',3,64),(31,'操作系统',3,89),(32,'编译原理',3,21),(33,'软件测试',3,47),(34,'Android',3,86),(35,'spring',3,35),(36,'mysql',3,88),(37,'vue.js',3,74),(38,'linux',3,38),(39,'hadoop',3,96),(40,'H5前端',4,55),(41,'java基础',4,78),(42,'需求分析',4,94),(43,'大学英语',4,81),(44,'操作系统',4,68),(45,'编译原理',4,70),(46,'软件测试',4,56),(47,'Android',4,30),(48,'spring',4,79),(49,'mysql',4,99),(50,'vue.js',4,75),(51,'linux',4,32),(52,'hadoop',4,45),(53,'H5前端',5,84),(54,'java基础',5,56),(55,'需求分析',5,42),(56,'大学英语',5,68),(57,'操作系统',5,47),(58,'编译原理',5,65),(59,'软件测试',5,34),(60,'Android',5,23),(61,'spring',5,78),(62,'mysql',5,96),(63,'vue.js',5,45),(64,'linux',5,96),(65,'hadoop',5,75),(66,'H5前端',6,84),(67,'java基础',6,56),(68,'需求分析',6,42),(69,'大学英语',6,68),(70,'操作系统',6,47),(71,'编译原理',6,65),(72,'软件测试',6,34),(73,'Android',6,23),(74,'spring',6,78),(75,'mysql',6,96),(76,'vue.js',6,45),(77,'linux',6,96),(78,'hadoop',6,75),(79,'H5前端',7,84),(80,'java基础',7,56),(81,'需求分析',7,42),(82,'大学英语',7,68),(83,'操作系统',7,47),(84,'编译原理',7,65),(85,'软件测试',7,38),(86,'Android',7,56),(87,'spring',7,45),(88,'mysql',7,82),(89,'vue.js',7,50),(90,'linux',7,96),(91,'hadoop',7,100),(92,'H5前端',8,45),(93,'java基础',8,65),(94,'需求分析',8,35),(95,'大学英语',8,85),(96,'操作系统',8,69),(97,'编译原理',8,56),(98,'软件测试',8,78),(99,'Android',8,54),(100,'spring',8,56),(101,'mysql',8,52),(102,'vue.js',8,99),(103,'linux',8,100),(104,'hadoop',8,96),(105,'H5前端',9,78),(106,'java基础',9,45),(107,'需求分析',9,86),(108,'大学英语',9,75),(109,'操作系统',9,12),(110,'编译原理',9,53),(111,'软件测试',9,68),(112,'Android',9,78),(113,'spring',9,24),(114,'mysql',9,78),(115,'vue.js',9,15),(116,'linux',9,96),(117,'hadoop',9,23),(118,'H5前端',10,98),(119,'java基础',10,99),(120,'需求分析',10,96),(121,'大学英语',10,68),(122,'操作系统',10,65),(123,'编译原理',10,78),(124,'软件测试',10,89),(125,'Android',10,87),(126,'spring',10,78),(127,'mysql',10,35),(128,'vue.js',10,87),(129,'linux',10,78),(130,'hadoop',10,56);/* Procedure structure for procedure `pro_test` *//*!50003 DROP PROCEDURE IF EXISTS  `pro_test` */;DELIMITER $$/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_test`()
BEGIN-- 需要定义接收游标数据的变量 DECLARE done boolean DEFAULT 0;DECLARE v_avg float;-- 平均分DECLARE v_max INT;-- 最高分DECLARE v_min INT; -- 最低分DECLARE v_lose INT; -- 考试不及格的人数DECLARE v_courseName varchar(32); -- 课程名称-- 定义游标DECLARE cur1 CURSOR FOR SELECT course_name, avg(score) v_avg, MAX(score) v_max, MIN(score) v_min FROM score GROUP BY course_name;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;-- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;-- 打开游标OPEN cur1;-- 开始循环REPEATFETCH cur1 INTO v_courseName,v_avg,v_max,v_min;if done <1 or done >1 thenSELECT COUNT(1) into v_lose FROM score WHERE v_courseName = course_name and score<60;    INSERT INTO grades VALUES(v_courseName,v_avg,v_max,v_min,v_lose);end if;UNTIL done = 1END REPEAT;
-- 循环结束-- 关闭游标CLOSE cur1 ;
END */$$
DELIMITER ;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

mysql存储过程 根据查询的结果集向表中插入数据相关推荐

  1. Mysql命令insert into:向表中插入数据(记录)

    insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...

  2. Mysql之向表中插入数据

    Mysql之向表中插入数据 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...f ...

  3. mysql杠杆加号什么意思_对tb_book表中的数据,按ID序号进行升序排列,查询语句是什么?_学小易找答案...

    [单选题]修改数据库表结构用以下哪一项 ( ) [单选题]对于一个微小物理量,通常采用将其进行放大的方法实现测量,以下哪个不是物理实验方法? [单选题]扭摆实验中,为了测出金属匀质细杆绕质心对称轴的转 ...

  4. c# 向mysql插入数据_C#连接mysql数据库 及向表中插入数据的方法

    mysql 语句操作: 创建数据库:create database hotelATMDb; use hotelATMDb; C#连接mysql 1.引用 dll MySql.Data.dll 下载地址 ...

  5. mysql 循环取值 重复循环_mysql在for循环中插入数据重复问题

    html页面发送请求到php,然后php执行for循环插入多条数据,发现偶尔会有部分数据重复 场景 抓取网上图片保存,因此执行时间挺长,但是设置过,不至于超时 for循环一次,下载图片,select判 ...

  6. mysql如何在一个表中插入数据的同时,更新另一个表的数据?

    三种方案,你看看哪个比较适合你 1,适用于学生: 写两个方法,一个新增一个更新,在新增完了以后马上去查询一下,按主键倒叙排列,取到最新插入的id,前提主键是自增的且不是uuid,然后把查到的主键返回出 ...

  7. mysql之往表中插入数据

    同时插入多个数据: INSERT INTO $(table_name) VALUES(...), (...), (...); 往表中插入从其它表中获取到的数据: INSERT INTO $(dest_ ...

  8. 4、MySQL——向数据表中插入数据,修改数据表中的数据,数据表删除操作

    目录 一.数据表插入操作:INSERT 1. 给表中的所有字段插入数据 2.给表中的个别字段插入数据 3.向数据表中批量插入多条数据 二.数据表修改操作:UPDATE 1.修改所有字段的数据 2.修改 ...

  9. 向MySQL数据库中插入数据,sql语句没问题,但插入失败也不报错?

             这几天在做一个Javaweb的图书商城项目,在操作数据库的过程中,遇到一个问题? 向数据库中的order数据表中插入数据时,一直插入数据失败.没有报SQL语句语法错误,Eclipse ...

最新文章

  1. 设计模式:设计模式七大原则
  2. Thinkphp学习笔记-编辑工具Sublime license
  3. HttpHandler应用之 防止图片盗链
  4. oracle怎么查询换行符,关于oracle:如何检查表中所有列的换行符
  5. MySQL远程用户授权
  6. 一生里和你爱的人做完这50件事
  7. python string转int_Python编程入门:time模块常用技巧
  8. adventnet trap
  9. 怎样修改计算机系统8,win8改win7,教您win8怎么改为win7系统
  10. WebGL白模做专题图注意事项
  11. 如何修改ns服务器,Godaddy如何修改NS信息
  12. findfont: Font family ['DejaVu Sans'] not found. Falling back to DejaVu Sans.
  13. Java Web之第11章JSP开发模型
  14. 群星灵能界所有事件_张丹峰出轨经纪人实锤!愿所有原配都能活得像小三一样...
  15. 平平无奇的营销小天才——ChatGPT
  16. 文件和文件夹的操作——文件夹的操作
  17. 如何用Xshell快速连接远程电脑
  18. 爬取淘宝女郎的照片-写给初步入门爬虫的读者
  19. 和客户沟通中能让你加分的英语细节
  20. flutter 国际化flutter使用 intl插件,provider状态保存

热门文章

  1. JAVA实现 剑指offer第二版 2
  2. 手机里面的照片被误删了怎么找回?
  3. wi-fi频宽设置_如何设置TP-Link Wi-Fi智能插头
  4. 【基于python+Django的物品协同过滤音乐推荐系统-哔哩哔哩】 https://b23.tv/V2zN54R
  5. Python和Java哪个好学?
  6. Arduino ESP32 TFTLCD ST7735 代码和原理
  7. 深度学习·理论篇(2023版)·第001篇快速了解人工智能与Pytorch:机器/表示/深度学习定义+端到端的学习+神经网络在计算机视觉应用+深度学习的技术蓝图
  8. 电风扇 DIY闪字发光小风扇 休闲懒人鞋 无叶塔扇 空调扇
  9. 矩阵求逆_伴随矩阵法
  10. PS人物快速换装--纯色换成碎花装