一文带你了解MySQL中的游标(基本语法)
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《一文带你了解MySQL中的游标(基本语法)》,介绍一下MySQL,希望对大家的知识积累有所帮助,助力实战开发!
1、什么是游标(或光标)
虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,我们可以通过操作游标来对数据行进行操作MySQL中游标可以在存储过程和函数中使用比如,我们查询了 employees 数据表中工资高于15000的员工都有哪些:
SELECT employee_id,last_name,salary FROM employees WHERE salary > 15000;

这里我们就可以通过游标来操作数据行,如图所示此时游标所在的行是“108”的记录,我们也可以在结果集上滚动游标,指向结果集中的任意一行。2、如何使用游标游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。1、声明游标语法格式:DECLARE 游标名 CURSOR FOR 查询语句;
要使用 SELECT 语句来获取数据结果集,而此时还没有开始遍历数据,这里 查询语句代表的是 SELECT 语句,返回一个用于创建游标的结果集举例:
DECLARE emp_cur CURSOR FOR SELECT employee_id,salary FROM employees;
2、打开游标语法格式:OPEN 游标名;
当我们定义好游标之后,如果想要使用游标,必须先打开游标。打开游标的时候 SELECT 语句的查询结果集就会送到游标工作区,为后面游标的逐条读取结果集中的记录做准备。3、使用游标语法格式:
FETCH 游标名 INTO var_name [, var_name] ...
这句的作用是使用 游标名这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。注意: var_name必须在声明游标之前就定义好。举例:
FETCH emp_cur INTO emp_id, emp_sal ;
注意: 游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致4、关闭游标语法格式:CLOSE 游标名;
当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。关闭游标之后,我们就不能再检索查询结果中的数据行,如果需要检索只能再次打开游标。3、代码举例#创建存储过程“get_count_by_limit_total_salary()”,
声明IN参数 limit_total_salary,DOUBLE类型;声明OUT参数total_count,INT类型。
函数的功能可以实现累加薪资最高的几个员工的薪资值,
直到薪资总和达到limit_total_salary参数的值,返回累加的人数给total_count。
DELIMITER $ CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT) BEGIN DECLARE count_emp INT DEFAULT 0; #用来记录人数,默认值是0 DECLARE sum_sal DOUBLE DEFAULT 0; #记录总薪资 DECLARE one_sal DOUBLE DEFAULT 0; #记录一个人的薪资 #声明游标,把查询到的工资结果集从高到低排序 DECLARE emp_cur CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC; OPEN emp_cur; #打开游标 #用循环语句遍历,知道总薪资满足题目要求 REPEAT #开始使用游标 FETCH emp_cur INTO one_sal; SET sum_sal = sum_sal + one_sal; SET count_emp = count_emp + 1; UNTIL sum_sal >= limit_total_salary END REPEAT; CLOSE emp_cur; #关闭游标 #把结果返回给total_count SELECT count_emp INTO total_count; END $ DELIMITER ; CALL get_count_by_limit_total_salary(30000,@count); SELECT @count;
思路分析: 先创建存储过程,然后再根据实际情况declare自己需要的变量来满足题目的要求,游标要按步骤来:创建游标、打开游标、使用游标最后再关闭游标;其中要注意使用游标在循环中,可以提高代码的简洁度。4、小结游标是 MySQL 的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。
建议: 养成用完之后就关闭的习惯,这样才能提高系统的整体效率。感兴趣的朋友可以在3A云服务器上自己部署尝试一下
今天带大家了解了MySQL的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

- 上一篇
- StoneDB社区答疑第一期

- 下一篇
- MySQL执行查询的内部原理
-
- 谨慎的啤酒
- 细节满满,码起来,感谢up主的这篇技术文章,我会继续支持!
- 2023-04-26 00:53:49
-
- 复杂的抽屉
- 这篇博文太及时了,好细啊,很好,已加入收藏夹了,关注作者了!希望作者能多写数据库相关的文章。
- 2023-03-04 09:21:48
-
- 鳗鱼母鸡
- 这篇文章出现的刚刚好,太详细了,赞 ??,收藏了,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-02-18 18:13:30
-
- 正直的帆布鞋
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢大佬分享技术文章!
- 2023-02-08 16:06:58
-
- 舒服的春天
- 细节满满,已收藏,感谢大佬的这篇博文,我会继续支持!
- 2023-01-31 21:52:45
-
- 温婉的树叶
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢大佬分享技术贴!
- 2023-01-23 20:57:26
-
- 数据库 · MySQL | 9小时前 |
- MySQL分片方案与实现方法解析
- 318浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL安装配置教程手把手教你安装步骤
- 486浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL基础命令速查新手必学指南
- 129浏览 收藏
-
- 数据库 · MySQL | 13小时前 |
- MySQL数据库入门:核心概念与操作全解析
- 315浏览 收藏
-
- 数据库 · MySQL | 18小时前 |
- 主键外键关系解析与关联原理
- 157浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL常用存储引擎有哪些?InnoDB与MyISAM对比解析
- 174浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL创建数据库的详细步骤教程
- 283浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQLLIKE查询优化技巧分享
- 302浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL数据库30条必备管理命令
- 143浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL数据同步方式全解析
- 320浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL事务是什么?如何保证数据一致性?
- 260浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 主外键关系详解:MySQL主键外键关联全解析
- 360浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 119次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 114次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 131次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 125次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 127次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览