MySQL数据库高级(九)——游标
admin
2023-05-01 09:04:18
0次

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 id,name,age from cursor_table where age>30;  
    #指定游标循环结束时的返回值  
    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 id,name,age from cursor_table where age>30;  
    #指定游标循环结束时的返回值  
    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 id,name,age from cursor_table where age > 30;  
    #指定游标循环结束时的返回值  
    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、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...