文章目录

  • 1、什么是游标(或光标)
  • 2、如何使用游标
  • 3、代码举例
  • 4、小结

写在前面:跟随B站的康师傅学习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)
BEGINDECLARE count_emp INT DEFAULT 0;   #用来记录人数,默认值是0DECLARE 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_salaryEND REPEAT;CLOSE emp_cur;  #关闭游标#把结果返回给total_countSELECT count_emp INTO total_count;
END $
DELIMITER ;CALL get_count_by_limit_total_salary(30000,@count);
SELECT @count;

思路分析: 先创建存储过程,然后再根据实际情况declare自己需要的变量来满足题目的要求,游标要按步骤来:创建游标、打开游标、使用游标最后再关闭游标;其中要注意使用游标在循环中,可以提高代码的简洁度。

4、小结

游标是 MySQL 的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。

但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。

建议: 养成用完之后就关闭的习惯,这样才能提高系统的整体效率。

爱在结尾:游标的使用结合了以前学习过的存储过程、流程控制以及用户自定义变量相关的知识点,单单看游标这一个知识点是不难的,自己还是应该多多回顾以前学过的知识点,做到融会贯通。

快进来,详解MySQL游标相关推荐

  1. mysql游标循环的使用_实例详解mysql游标循环的使用

    这篇文章主要介绍了mysql游标循环的使用,有一定的参考价值,感兴趣的朋友可以参考一下,希望对你有所帮助!CREATE PROCEDURE `test`.`new_procedure` ()BEGIN ...

  2. mysql case then效率快_详解Mysql case then使用

    表的创建 create table `lee` ( `id` int(10) not null auto_increment, `name` char(20) default null, `birth ...

  3. mysql 事物的持久性是指_详解MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...

  4. mysql影响行数解析_详解MySQL的数据行和行溢出机制

    一.行 有哪些格式? 你可以像下面这样看一下你的mysql行格式设置. 其实mysql的数据行有两种格式,一种就是图中的 compact格式,还有一种是redundant格式. compact是一种紧 ...

  5. mysql数据库中count的作用_详解 MySQL中count函数的正确使用方法

    1. 描述 在MySQL中,当我们需要获取某张表中的总行数时,一般会选择使用下面的语句 select count(*) from table; 其实count函数中除了*还可以放其他参数,比如常数.主 ...

  6. mysql如何进行压测_详解MySQL如何按表创建千万级的压测数据

    有时我们要对系统做压测,或者数据库压力测试,这时候需要对某些表插入几百万或者上千万数据,下面介绍下怎么利用MySQL循环和存储过程对特定表的创建千万行数据. 1. 准备测试表 CREATE TABLE ...

  7. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复

    日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA. 相关文章 MySQL备份策略:https://segmentfa ...

  8. mysql inner join where_详解mysql 使用left join添加where条件的问题分析

    当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志. 最开始的错误写法一: SEL ...

  9. mysql 用户管理表_Mysql—用户表详解(mysql.user)

    MySQL 数据库 Mysql-用户表详解(mysql.user) MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限 ...

  10. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

    <Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...

最新文章

  1. k8s service type_k8s重器之Service
  2. 想成为系统高手就进来,就怕你学不完
  3. c# winform 关于给静态全局变量赋值的问题
  4. 一段动态生成表格的JSP代码讲解
  5. muduo学习笔记 - 第五章 高效的多线程日志
  6. 阿里云三维可视化使用初体验
  7. Centos7.3 坑爹网络配置
  8. 蔚来ET5将于2022年9月开启交付 补贴前售价32.8万元起
  9. ddd架构 无法重构_DDD有什么用?
  10. java生产者消费者模型到精通_java生产者消费者模型
  11. IJCAI阿里论文 | JUMP: 一种点击和停留时长的协同预估器...
  12. 通过VBA将excel数据导入至word文档
  13. 黄永成-thinkphp讲解-个人博客讲解25集
  14. 三分钟看懂什么是运维
  15. MySQL创建自定义函数提示:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its ......
  16. SOJ-4484-后缀数组
  17. Web前端开发十日谈
  18. 《图像处理、分析与机器视觉》(第4版)阅读笔记——第五章 图像预处理
  19. 5.29 C语言练习(计算数字个数:从键盘输入一串字符,输出字符串里的数字字符数。)
  20. 微服务架构设计总结实践篇,10 步搭建微服务

热门文章

  1. Qt QLabel实现自动换行 字符断行 自适应
  2. Qt_ERROR qt闪退 竟然是因为pro文件中的冒出来的\n
  3. 包分类算法最坏情况下性能比较
  4. 非模块化jar的模块化转换
  5. 常见排序算法之归并排序
  6. 服务器位置设置在哪,服务器位置设置在哪
  7. php中mbsubstr汉字,php中文字符串截取(mb_substr)实例
  8. c串口一直读到缓存数据_STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)...
  9. python管道怎么使用_Python – 如何使用管道执行shell命令?
  10. socket网络字节序以及大端序小端序