在MySQL中使用游标和for循环
目录
MySQL游标的属性
创建MySQL游标
声明语句
声明一个变量
为 SELECT语句声明游标
公开声明
Fetch语句
关闭声明
使用MySQL游标
MySQL存储过程
MySQL游标的注意事项
结论
在本文中,我们将学习使用MySQL游标和for循环,它们的功能类似于一般编程中的迭代循环。我们还将介绍变量、游标和处理程序声明。
考虑一般编程中的循环。它们帮助您重复执行特定的指令序列,直到特定条件中断循环。MySQL还提供了一种使用游标在各个行上执行指令的方法。MySQL中的游标将对SQL查询返回的行执行一组指令。
MySQL游标的属性
- 不可滚动:您只能在一个方向上遍历行。你不能跳过一行;你不能跳到一行;你不能回到一行。
- 只读:您不能使用游标更新或删除行。
- Asensitive:MySQL游标指向底层数据。它比不敏感的游标运行得更快。不敏感游标指向基础数据的快照,使其比敏感游标慢。
创建MySQL游标
要创建MySQL游标,您需要使用DECLARE、OPEN、FETCH和CLOSE语句。
声明语句
该DECLARE语句可以声明变量、游标和处理程序。有一系列声明需要遵守:
- 变量
- 游标
- 处理程序
您必须首先声明至少一个变量,以便稍后与该FETCH语句一起使用。
DECLARE <variable_name> <variable_type>
DECLARE <variable_name> <variable_type>
声明一个变量
声明游标时,必须附加一条SELECT语句。任何有效SELECT的声明都会起作用。您还必须声明至少一个游标。
DECLARE <cursor_name> CURSOR FOR <select_statement>
为 SELECT语句声明游标
您还必须声明一个NOT FOUND处理程序。当游标迭代并到达最后一行时,它会引发一个将由NOT FOUND处理程序处理的条件。您还可以根据需要声明其他处理程序。例如:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
使用NOT FOUND处理程序
公开声明
该OPEN语句初始化DECLARE游标语句的结果。
OPEN <cursor_name>
OPEN语句语法
Fetch语句
该FETCH语句用作迭代器。它从与游标声明中的SELECT语句关联的行中获取下一行。
FETCH <cursor_name> INTO <variable_list>
FETCH语句语法
<variable_list>是前面声明的变量中的一个或多个变量。
FETCH <cursor_name> INTO a, b, c
示例变量列表
如果下一行存在,则变量存储它;否则,会出现带有SQLSTATE“02000”的无数据条件。你可以使用NOT FOUND处理程序来处理这个SQLSTATE。
关闭声明
此语句关闭在`OPEN`语句中打开的游标。
CLOSE <cursor_name>
CLOSE语句语法
使用MySQL游标
准备好开始使用MySQL游标了吗?首先,您需要创建一个数据库和一个表。在此演示中,我们将使用此CSV文件中的数据填充一个表。
我们将创建一个游标:
- 循环遍历football表
- 计算赢得比赛的主队在中场休息时的平均进球数
这是完成此操作的MySQL过程的样子。
MySQL存储过程
DELIMITER $$ CREATE PROCEDURE cursordemo(INOUT average_goals FLOAT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE matches int DEFAULT(0);
DECLARE goals int DEFAULT(0);
DECLARE half_time_goals INT;
DECLARE team_cursor CURSOR FOR
SELECTHTHG
FROMepl.football
WHERE(FTR = "H");DECLARECONTINUE HANDLER FOR NOT FOUND
SETdone = TRUE;OPEN team_cursor;
teams_loop:
LOOPFETCH team_cursor INTO half_time_goals;
IF done THEN LEAVE teams_loop;
END IF;
SETgoals = goals + half_time_goals;
SETmatches = matches + 1;
END
LOOPteams_loop;
SETaverage_goals = goals / matches;
CLOSE team_cursor;END $$ DELIMITER;
MySQL存储过程
MySQL中的存储过程就像一个包含一系列指令的容器。存储过程用MySQL编写并存储在数据库中。我们在过程中定义游标,因为过程是可重用的。执行上面的SQL存储过程会将过程存储在数据库中。我们可以使用它的名字来调用这个过程,如下所示:
SET @average_goals = 0.0;
CALL cursordemo(@average_goals);
SELECT @average_goals;
执行我们刚刚创建的存储过程
此操作的输出是:
1.080954670906067
MySQL游标的注意事项
仔细看一下这个例子可以看出,类似的SQL查询SELECT AVG(HTHG) FROM epl.football WHERE (FTR="H");将获得相同的结果。最好在一次处理一行时只使用游标。例如完整性检查、索引重建。请注意,每次游标获取一行时,都会导致网络往返。因此,它最终可能会减慢MySQL服务器的速度,具体取决于操作的规模。
结论
在本文中,我们了解了如何使用MySQL游标和for循环,它们的功能类似于一般编程中的迭代循环。我们还介绍了变量、游标和处理程序声明。
使用游标的计算成本可能很高。当MySQL没有提供任何其他方式来使用标准查询或用户定义的函数来实现相同的结果时,最好只使用它们。但是,如果是这样的话,它们是非常强大的工具。
https://www.codeproject.com/Articles/5317993/Using-Cursors-and-for-Loops-in-MySQL
在MySQL中使用游标和for循环相关推荐
- 自动化测试之获取mysql中的数据
各位小伙伴们,大家好,今天给大家带来的是关自动化测试之获取mysql数据库中的数据方面的干货,技术含金量超高,有测开方面发展的小伙伴可以好好看看. 实施自动化获取mysql数据库中的数据的前提知识有: ...
- mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表
游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR ...
- MySQL 中的三中循环 while loop repeat 的基本用法
-- MySQL中的三中循环 while . loop .repeat 求 1-n 的和-- 第一种 while 循环 -- 求 1-n 的和 /* while循环语法: while 条件 DO循环体 ...
- django mysql 游标,MySQL Cursor 存储过程之游标与相关循环
简单介绍游标 在检索出来的行中,前进或者后退一行或多行,就需要用到所谓的"游标". 游标不是某个SELECT语句,但是它是被该语句检索出来的结果集. 几个特点: ·MySQL游标只 ...
- mysql中游标能不能更新数据库_MySQL与MariaDB中游标的使用
本文目录: 1.游标说明 2.使用游标 3.游标使用示例 1.游标说明 游标,有些地方也称为光标.它的作用是在一个结果集中逐条逐条地获取记录行并操作它们. 例如: 其中select是游标所操作的结果集 ...
- 【MySql】MySql存储,游标,循环的简单使用
MySql存储,游标,循环 CREATE PROCEDURE `copy_group`(IN v_sourcegroupid int,IN v_destgroupid int,IN v_project ...
- 【MySQL 中 动态sql,游标_】
MySQL 中 动态sql,游标_SQLServer MySQL的技术博客_51CTO博客
- Mysql中的三种循环
1,while-do-end while /* while循环语法: while 条件 DO循环体; end while; */-- 实例: create procedure sum1(a int) ...
- mysql中使用存储过程,游标,定时任务
------ --一句不对就是创建个job,之前一直认为只有Oracle才可以完成这些,其实不然,我也是才知道mysql如此强大呀!!~-- -- 0.创建一张表,加几条数据待会儿看效果======= ...
最新文章
- 存储时间:高清3D化,技术应用化?
- 什么是透传通道?(透明传输通道,就是当中继使)
- [征求意见]团队发展、技术交流主题、团队机构
- leetcode —— 1290. 二进制链表转整数
- node实现基于token的身份验证
- 由翻转字符窜再次理解递归
- GoF23种设计模式之创建型模式之建造者模式
- docker容器持久化卷讲解
- 机械优化设计c语言鲍威尔法,机械优化设计C语言程序.doc
- PAT甲之初窥门径(上)
- C/C++ 学生考勤系统
- php选择栏可输入可选择,填制凭证时,“科目名称”栏可选择用下列()方法输入。...
- 如何对研发团队绩效进行考核?【附各环节人员考核参考表】
- 佛罗里达大学计算机工程专业,佛罗里达大学cs专业
- vs2015中安装cplex攻略以及解决丢失cplex.dll问题
- 教程:这两个小妙招手把手教会你白底图片怎么抠图
- Java多线程--深入浅出Java多线程
- 有了LIGO,引力波不仅可以被探测,还可以被发射!
- ❤️小白到精英必备的100多个Python函数汇总❤️写代码都流畅多了
- 计算机U盘那种好,什么牌子的u盘好用耐用?u盘质量排行榜前十
热门文章
- java struts2 mvc_struts2的MVC模式
- go 依赖注入 哪个好_go与java的依赖注入实现的一些差异
- wxpython textctrl_如何从wxpython中的textctrl接受值
- python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间
- 计算机系毕业生自我评价,计算机系应届毕业生自我评价范文
- openwrt patch文件怎么用_openwrt 打补丁方式修改内核源码
- 三八妇女节PSD分层海报,来啦!
- 金色装饰素材,用这个技巧创造节日的感觉,完美
- UI设计素材|动画的妙处,有助于吸引你的用户
- UI素材渐变配色专辑,对比用色轻松驾驭