MySQL数据库高级(九)——游标

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

原文地址:http://blog.51cto.com/9291927/2097626

时间: 2024-08-10 01:08:41

MySQL数据库高级(九)——游标的相关文章

MySQL数据库高级(二)——自定义函数

MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同.自定义函数的两个必要条件:A.参数B.返回值(必须有).函数可以返回任意类型的值. 二.自定义函数的使用 1.自定义函数语法 CREATE?FUNCTION?function_name(parameter_nametype,[parameter_name type,...]) RETURNS?{STRING|INTEG

MySQL数据库高级(三)——视图

MySQL数据库高级(三)--视图 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含一系列带有名称的数据列和数据行,但视图中的数据并不真实存在于数据库中,视图返回的是结果集. 2.创建视图的目的 视图是存储在数据库中的查询的SQL语句,创建视图主要出于两种原因:A.实现安全.视图可设置用户对视图的访问权限.创建查询是JAVA班学生成绩的视图javaview.NET班学生成绩的视图netview,授权zhang能够访问javavi

MySQL数据库高级(四)——存储过程

MySQL数据库高级(四)--存储过程 一.存储过程简介 1.存储过程简介 存储过程是一组具有特定功能的SQL语句集组成的可编程的函数,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数来调用执行.存储过程是数据库管理中常用的技术之一,可以很方便的做些类似数据统计.数据分析等工作,SQL SERVER.ORACLE.MySQL都支持存储过程,但不同的数据库环境语法结构有所区别. 2.存储过程的优点 A.存储过程增强了SQL语言的功能和灵活性.存储过程可以用流控制语句编写,有很强的

MySQL数据库高级(五)——触发器

MySQL数据库高级(五)--触发器 一.触发器简介 1.触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力. 2.触发器的优点 A.安全性可以基于数据库的值使用户具有操作数据库的某种权利.可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据:可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%.B.审计可以跟踪用户对数据库的操作.???审计用户操作数据库的语句:把

MySQL数据库高级(六)——索引

MySQL数据库高级(六)--索引 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构.在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的.MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引. 2.索引的优点 A.提高数据检索效率,降低数据库的IO成本.B.通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗.C.大大加快数据的查询速度. 3.索引的缺点 A.

MySQL数据库 高级查询(一)

常用函数 常用聚合函数: AVG() 返回某字段的平均值 COUNT() 返回某字段的行数 MAX() 返回某字段的最大值 MIN( ) 返回某字段的最小值 SUM( ) 返回某字段的和 函数名 作用 常用的字符串函数 函数名 作用 举例 CONCAT(str1,str2,...,strn) 连接字符串str1,str2,...,strn为一个完整字符串 SELECT CONCAT('My','S','QL'); 返回:MySQL INSERT(str,pos,len,newstr) 将字符串s

mysql 数据库 简单存储过程游标使用

BEGIN #Routine body goes here... DECLARE no_more_record INT DEFAULT 0; DECLARE TEST_ID INT(20); DECLARE TEST_USERNAME VARCHAR(20); DECLARE TEST_SEX INT(2); DECLARE TEST_ADDRESS VARCHAR(20); DECLARE cur_record CURSOR FOR SELECT id, username,sex,addres

MySQL数据库 高级查询(二)

高级查询(二)  EXISTS 子查询 语法: SELECT ..... FROM  表名 WHERE EXISTS (子查询); EXISTS 关键字后面的参数是一个任意的子查询,如果该子查询有返回值,则EXISTS 子查询的结果为true,此时再执行外层查询语句.如果没有返回行,则EXISTS 子查询 的结果为false,此时外层语句不再执行查询.  NOT EXISTS 子查询 EXISTS 子查询和NOT EXISTS 子查询的结果只取决于是否有返回记录,不取决于这些记录的内容,所以EX

MYSQL数据库学习九 数据的操作

9.1 插入数据记录 1. 插入完整或部分数据记录: INSERT INTO table_name(field1,field2,field3,...fieldn) VALUES(value1,value2,value3,...valuen); 插入完整数据记录时可以省略字段参数(field1,field2,field3,...fieldn). 注意:在具体开发中,除了“自动增长”约束的字段不需要插入数值外,具有“默认值”约束的字段也不需要插入数值. 2. 插入多条完整或部分数据记录: INSER