• 售前

  • 售后

热门帖子
入门百科

MySQL游标详细介绍

[复制链接]
JDLMDJIA 显示全部楼层 发表于 2022-1-9 05:01:03 |阅读模式 打印 上一主题 下一主题
目次


  • 1、什么是游标(或光标)
  • 2、如何使用游标

    • 1、声明游标
    • 2、打开游标
    • 3、使用游标
    • 4、关闭游标

  • 3、代码举例
  • 4、小结

1、什么是游标(或光标)

虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在效果会合像指针一样,向前定位一条记录、向后定位一条记录,或者是
  1. 随意定位到某一条记录
复制代码
,并对记录的数据进行处理。
这个时候,就可以用到游标。游标,提供了一种机动的使用方式,让我们可以或许对效果会合的每一条记录进行定位,并对指向的记录中的数据进行使用的数据布局。游标让 SQL 这种面向聚集的语言有了面向过程开发的本事。
SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标
  1. 充当了指针的作用
复制代码
,我们可以通过使用游标来对数据行进行使用
  1. MySQL中游标可以在存储过程和函数中使用
复制代码
比如,我们查询了 employees 数据表中工资高于15000的员工都有哪些:
  1. SELECT employee_id,last_name,salary FROM employees
  2. WHERE salary > 15000;
复制代码

这里我们就可以通过游标来使用数据行,如图所示此时游标所在的行是“108”的记录,我们也可以在效果集上滚动游标,指向效果会合的恣意一行。

2、如何使用游标

游标必须在声明处理程序之前被声明,而且变量和条件还必须在声明游标或处理程序之前被声明。

1、声明游标

语法格式:
  1. DECLARE 游标名 CURSOR FOR 查询语句;
复制代码
要使用 SELECT 语句来获取数据效果集,而此时还没有开始遍历数据,这里 查询语句代表的是 SELECT 语句,
  1. 返回一个用于创建游标的结果集
复制代码
举例:
  1. DECLARE emp_cur CURSOR FOR
  2. SELECT employee_id,salary FROM employees;
复制代码
2、打开游标

语法格式:
  1. OPEN 游标名;
复制代码
当我们定义好游标之后,假如想要使用游标,必须先打开游标。打开游标的时候 SELECT 语句的查询效果集就会送到游标工作区,为背面游标的
  1. 逐条读取
复制代码
效果会合的记录做预备。

3、使用游标

语法格式:
  1. FETCH 游标名 INTO var_name [, var_name] ...
复制代码
这句的作用是使用
  1. 游标名
复制代码
这个游标来读取当前行,而且将数据生存到 var_name 这个变量中,游标指针指到下一行。假如游标读取的数据行有多个列名,则在 INTO 关键字背面赋值给多个变量名即可。
注意: var_name必须在声明游标之前就定义好。
举例:
  1. FETCH emp_cur INTO emp_id, emp_sal ;
复制代码
注意: 游标的查询效果会合的字段数,必须跟 INTO 背面的变量数同等

4、关闭游标

语法格式:
  1. CLOSE 游标名;
复制代码
当我们使用完游标后需要关闭掉该游标。因为游标会
  1. 占用系统资源
复制代码
,假如不及时关闭,游标会不绝保持到存储过程结束,影响体系运行的效率。而关闭游标的使用,会释放游标占用的体系资源。
关闭游标之后,我们就不能再检索查询效果中的数据行,假如需要检索只能再次打开游标。

3、代码举例
  1. #创建存储过程“get_count_by_limit_total_salary()”,
  2. #声明IN参数 limit_total_salary,DOUBLE类型;声明OUT参数total_count,INT类型。
  3. #函数的功能可以实现累加薪资最高的几个员工的薪资值,
  4. #直到薪资总和达到limit_total_salary参数的值,返回累加的人数给total_count。
  5. DELIMITER $
  6. CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT)
  7. BEGIN
  8.         DECLARE count_emp INT DEFAULT 0;        #用来记录人数,默认值是0
  9.         DECLARE sum_sal DOUBLE DEFAULT 0;        #记录总薪资
  10.         DECLARE one_sal DOUBLE DEFAULT 0;        #记录一个人的薪资
  11.        
  12.         #声明游标,把查询到的工资结果集从高到低排序
  13.         DECLARE emp_cur CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
  14.        
  15.         OPEN emp_cur;        #打开游标
  16.        
  17.         #用循环语句遍历,知道总薪资满足题目要求
  18.         REPEAT
  19.                 #开始使用游标
  20.                 FETCH emp_cur INTO one_sal;
  21.                
  22.                 SET sum_sal = sum_sal + one_sal;
  23.                 SET count_emp = count_emp + 1;
  24.                
  25.                 UNTIL sum_sal >= limit_total_salary
  26.                
  27.         END REPEAT;
  28.         CLOSE emp_cur;        #关闭游标
  29.        
  30.         #把结果返回给total_count
  31.         SELECT count_emp INTO total_count;
  32. END $
  33. DELIMITER ;
  34. CALL get_count_by_limit_total_salary(30000,@count);
  35. SELECT @count;
复制代码
思绪分析: 先创建存储过程,然后再根据实际情况declare本身需要的变量来满意标题标要求,游标要按步调来:创建游标、打开游标、使用游标末了再关闭游标;其中要注意使用游标在循环中,可以进步代码的简便度。

4、小结

游标是 MySQL 的一个紧张的功能,为
  1. 逐条读取
复制代码
效果会合的数据,提供了完善的解决方案。跟在应用层面实现雷同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简便。
但同时也会带来一些性能标题,比如在使用游标的过程中,会对数据行进行
  1. 加锁
复制代码
,如许在业务并发量大的时候,不但会影响业务之间的效率,还会
  1. 消耗系统资源
复制代码
,造成内存不足,这是因为游标是在内存中进行的处理。
建议: 养成用完之后就关闭的风俗,如许才气进步体系的整体效率。
  1. 爱在结尾:游标的使用结合了以前学习过的存储过程、流程控制以及用户自定义变量相关的知识点,单单看游标这一个知识点是不难的,自己还是应该多多回顾以前学过的知识点,做到融会贯通。
复制代码
到此这篇关于MySQL游标详细先容的文章就先容到这了,更多相关MySQL游标内容请搜索脚本之家以前的文章或继续欣赏下面的相关文章盼望大家以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作