设为首页 收藏本站
查看: 845|回复: 0

[经验分享] MySQL数据库高级(九)——游标

[复制链接]

尚未签到

发表于 2018-9-27 10:34:49 | 显示全部楼层 |阅读模式
MySQL数据库高级(九)——游标

一、游标简介

1、游标简介
  游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
  尽管游标能遍历结果中的所有行,但一次只指向一行。
  游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。

2、游标的特性
  游标具有三个属性:
  A、不敏感(Asensitive):数据库可以选择不复制结果集
  B、只读(Read only)
  C、不滚动(Nonscrollable):游标只能向一个方向前进,并且不可以跳过任何一行数据。

3、游标的优点
  游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。

4、游标的缺点
  游标的主要缺点是性能不高。
  游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。如果采用面向集合的SQL语句,扫描成本为O(N);但如果采用面向集合的SQL语句的扫描成本为O(N*N),则使用游标有可能会带来性能上的提升。
  游标的缺点是只能一行一行操作。在数据量大的情况下,速度过慢。数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。

5、游标的适用场景
  MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。

二、游标的操作

1、游标的定义
  DECLARE cursor_name CURSOR FOR select_statement  

2、打开游标
  OPEN cursor_name;

3、取游标中的数据
  FETCH cursor_name INTO var_name [, var_name]...

4、关闭游标
  CLOSE cursor_name;

5、释放游标
  DEALLOCATE cursor_name;

三、游标实例

1、创建一张游标的测试表
  

CREATE TABLE cursor_table  
(
  
id INT ,
  
name VARCHAR(10),
  
age INT
  
)ENGINE=innoDB DEFAULT CHARSET=utf8;
  
insert into cursor_table values(1, '孙悟空', 500);
  
insert into cursor_table values(2, '猪八戒', 200);
  
insert into cursor_table values(3, '沙悟净', 100);
  
insert into cursor_table values(4, '唐僧', 20);
  

  使用三种方式使用游标创建一个存储过程,统计年龄大于30的记录的数量。

2、Loop循环
  

CREATE  PROCEDURE getTotal()  
BEGIN
  DECLARE total INT;
  ##创建接收游标数据的变量
  DECLARE sid INT;
  DECLARE sname VARCHAR(10);
  #创建总数变量
  DECLARE sage INT;
  #创建结束标志变量
  DECLARE done INT DEFAULT false;
  #创建游标

  DECLARE cur CURSOR FOR SELECT>  #指定游标循环结束时的返回值
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
  #设置初始值
  SET sage = 0;
  SET total=0;
  #打开游标
  OPEN cur;
  #开始循环游标里的数据
  read_loop:loop
  #根据游标当前指向的一条数据
  FETCH cur INTO sid,sname,sage;
  #判断游标的循环是否结束
  IF done THEN
  LEAVE read_loop;    #跳出游标循环
  END IF;
  #获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,
  SET total = total + 1;
  #结束游标循环
  END LOOP;
  #关闭游标
  CLOSE cur;
  

  #输出结果
  SELECT total;
  
END
  

#调用存储过程  
call getTotal();
  

3、While循环
  

CREATE  PROCEDURE getTotal()  
BEGIN
  DECLARE total INT;
  ##创建接收游标数据的变量
  DECLARE sid INT;
  DECLARE sname VARCHAR(10);
  #创建总数变量
  DECLARE sage INT;
  #创建结束标志变量
  DECLARE done INT DEFAULT false;
  #创建游标

  DECLARE cur CURSOR FOR SELECT>  #指定游标循环结束时的返回值
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
  SET total = 0;
  OPEN cur;
  FETCH cur INTO sid, sname, sage;
  WHILE(NOT done)
  DO
  SET total = total + 1;
  FETCH cur INTO sid, sname, sage;
  END WHILE;
  

  CLOSE cur;
  SELECT total;
  
END
  

4、Repeat循环
  

CREATE getTotal()  
BEGIN
  DECLARE total INT;
  ##创建接收游标数据的变量
  DECLARE sid INT;
  DECLARE sname VARCHAR(10);
  #创建总数变量
  DECLARE sage INT;
  #创建结束标志变量
  DECLARE done INT DEFAULT false;
  #创建游标

  DECLARE cur CURSOR FOR SELECT>  #指定游标循环结束时的返回值
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
  SET total = 0;
  OPEN cur;
  REPEAT
  FETCH cur INTO sid, sname, sage;
  IF NOT done THEN
  SET total = total + 1;
  END IF;
  UNTIL done END REPEAT;
  CLOSE cur;
  SELECT total;
  
END



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602695-1-1.html 上篇帖子: CentOS安装使用MySQL数据库 下篇帖子: mysql 误删除数据-数据回滚
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表