MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

16 | 游标:对于数据集中的记录,该怎么逐条处理?

你好,我是朱晓峰。今天,我来和你聊一聊游标。
咱们前面学习的 MySQL 数据操作语句,都是针对结果集合的。也就是说,每次处理的对象都是一个数据集合。如果需要逐一处理结果集中的记录,就会非常困难。
虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。
这个时候,就可以用到游标。所谓的游标,也就是能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。
这么说可能有点抽象,我举一个生活中的例子,你一看就明白了。比如,你想去某个城市旅游,现在需要订酒店。你打开预订酒店的 App,设置好价格区间后进行搜索,得到了一个酒店列表。接下来,你可能要逐条查看列表中每个酒店的客户评价,最后选择一个口碑不错的酒店。这个逐条搜索并对选中的数据进行操作的过程,就相当于游标对数据记录进行操作的过程。
今天我就来给你讲一讲游标的使用方法,同时还会通过一个案例串讲,帮助你更好地使用游标,让你能够轻松地处理数据集中的记录。

游标的使用步骤

游标只能在存储程序内使用,存储程序包括存储过程和存储函数。关于存储过程,我们上节课刚刚学过,这里我简单介绍一下存储函数。创建存储函数的语法是:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

MySQL中游标的使用方法及其在存储过程中的应用是本文的重点。游标是一种能够对结果集中的每一条记录进行定位,并对记录中的数据进行操作的数据结构。文章详细介绍了游标的使用步骤,包括定义游标、打开游标、读取数据以及关闭游标。通过实际案例演示了如何使用游标处理进货单数据,包括更新进价和库存等操作。此外,还介绍了条件处理语句和流程控制语句在存储过程中的应用。通过本文,读者可以快速了解游标的基本概念和在MySQL中的使用方法,以及如何通过存储过程和游标来处理复杂的数据操作问题。游标是MySQL的重要功能,能够高效地逐条读取结果集中的数据,提供了完美的解决方案。文章还提到了游标会消耗系统资源,建议养成使用完毕即关闭的习惯,以提高系统整体效率。总体而言,本文内容涵盖了游标的基本概念、使用方法以及在存储过程中的应用,对于想要深入了解MySQL游标的读者来说,是一篇值得阅读的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了存储过程。下面是思考题的答案: DELIMITER // CREATE PROCEDURE demo.test(IN a INT,OUT b INT) BEGIN SET b = a + 1; END // DELIMITER ;
    2021-05-17
    1
    1
  • 虹炎
    这里没看懂: DECLARE done INT DEFAULT FALSE; -- 用来控制循环结束 -- done 是int 类型,默认又是false?? REPEAT ...... 省略 UNTIL done END REPEAT; -- repeat 内容执行一次后,这个done 应该是false ,就直接退出了循环呢??

    作者回复: MySQL没有boolean类型,把true处理为1,把false处理为0。 UNTIL done,表示一直到done为true才退出。

    2021-05-18
    4
  • 彭彬
    MySQL的语法变态到了极点,从Oracle中取一点,从SQL Server中取一点,要把学生搞晕

    作者回复: ?

    2021-09-22
    2
    2
  • lesserror
    游标这块儿知识比较模糊,以后如果要使用游标,看这一讲基本够了,老师讲的很细致。以下是简单的总结: 1. 游标只能在存储程序内使用,存储程序包括存储过程和存储函数。 2. 游标为逐条读取结果集中的数据,提供了完美的解决方案。因为不需要后端语言写循环,造成与服务器端MySQL程序产生多次交互。 3. 游标用完就要马上关闭,避免造成性能损耗。

    作者回复: 对的

    2021-04-17
    1
  • Judy
    老师没有讲 数据库的锁机制吗?:(

    作者回复: 这个议题,超出了这门课的涉及范围,在丁奇老师的《MySQL实战45讲》中,有详细论述,建议您订阅。

    2022-05-10归属地:北京
  • 孙念池
    游标的场景是逐条处理,那么用程序写个循环也能实现同样效果吧,只是比起用sql的游标安全性低?效率低?

    作者回复: 我理解你的意思对比存储程序和程序,我的观点是,存储程序的运行效率更高一些,安全性也更好一些,但是维护成本也更高。

    2022-02-08
  • Geek_9a859a
    delimiter // create procedure demo.test()-- 创建存储过程 begin declare myid int; declare done int default 1;-- 用于循环中的条件判断如果done为1则继续循环,为0则退出循环 declare cursor_test cursor for-- 定义游标,结果集为test16表中的所有Id select Id from demo.test16; declare continue handler for not found set done = 0;-- 异常处理,当循环中fetch不到下一条数据时修改done的值退出循环 open cursor_test;-- 打开游标 fetch cursor_test into myid;-- 获取一条数据 while done-- 进入循环处理数据 do if myid % 2 = 1 then update demo.test16 set Myquant = Myquant + 2 where Id = myid;-- 当myid为奇数时 else update demo.test16 set Myquant = Myquant + 1 where Id = myid;-- 当myid为偶数时 end if;-- 结束条件判断 fetch cursor_test into myid;-- 获取下一条信息 end while; close cursor_test;-- 关闭游标 end // delimiter ;

    作者回复: 请参考思考题答案

    2021-12-23
  • 大聖
    CREATE DEFINER=`root`@`localhost` PROCEDURE `test_cursor`() begin declare quant int; declare my_id int; declare done int default FALSE; declare test_cursor cursor for select id, myquant from demo.test; declare continue handler for not found set done = true; open test_cursor; repeat fetch test_cursor into my_id, quant; if my_id % 2 = 0 then select quant as debug, my_id as id; update demo.test set myquant=quant + 1 where id = my_id; else update demo.test set myquant=quant + 2 where id = my_id; end if; until done end repeat; close test_cursor; end

    作者回复: 请参考思考题答案

    2021-08-02
  • -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 条件处理语句 -> -> OPEN cursor_importdata; -- 打开游标 -> FETCH cursor_importdata INTO mystockid,myitemnumber,myquantity,myprice; -- 读入第一条记录 -> REPEAT 打开游标,不能放到DECLARE CONTINUE HANDLER FOR ... 之前么?放到之前就报错。

    作者回复: 在存储程序中,定义语句要放在最前面,然后才可以执行打开光标的操作。

    2021-06-13
  • giteebravo
    游标 适用于需要对集合中的行进行单独处理的场景。

    作者回复: 是的

    2021-04-16
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部