MySQL游标详细介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL游标详细介绍
⽬录
1、什么是游标(或光标)
2、如何使⽤游标
1、声明游标
2、打开游标
3、使⽤游标
4、关闭游标
3、代码举例
4、⼩结
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 的⼀个重要的功能,为逐条读取结果集中的数据,提供了完美的解决⽅案。
跟在应⽤层⾯实现相同的功能相⽐,游标可以在存储程序中使⽤,效率⾼,程序也更加简洁。
但同时也会带来⼀些性能问题,⽐如在使⽤游标的过程中,会对数据⾏进⾏加锁,这样在业务并发量⼤的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不⾜,这是因为游标是在内存中进⾏的处理。
建议:养成⽤完之后就关闭的习惯,这样才能提⾼系统的整体效率。
爱在结尾:游标的使⽤结合了以前学习过的存储过程、流程控制以及⽤户⾃定义变量相关的知识点,单单看游标这⼀个知识点是不难的,⾃⼰还是应该多多回顾以前学过的知识点,做到融会贯通。
到此这篇关于MySQL游标详细介绍的⽂章就介绍到这了,更多相关MySQL游标内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。