16丨游标:当我们需要逐条处理数据时,该怎么做?
陈旸
该思维导图由 AI 生成,仅供参考
我们在编写 SQL 语句的时候通常是面向集合进行思考,这种思考方式更让我们关注结果集的特征,而不是具体的实现过程。面向集合的思考方式与面向过程的思考方式各有特点,我们该如何理解它们呢?
我们用下面这张图开启今天的学习。这张图中一共有 9 个图形,每个图形有不同的特征,包括形状、纹理、颜色和个数等。
当我们看到这张图时,有时候会不由自主地按照某个属性进行分类,比如说按照红色分类,那么 1、4、9 就是一类。这实际上就是属于同一个条件下的查询结果集。或者我们也可以按照物体的个数来划分,比如都有 3 个物体的,那么对应的就是 2、5、6、8,这就是对应着“都包括 3 个物体”的查询结果集。
你能看出来集合思维更像是从整体的角度来考虑,然后把整个数据集按照不同的属性进行划分,形成不同的子集合。面向集合的思考方式,让我们关注“获取什么”,而不是“如何获取”,这也可以说是 SQL 与传统编程最大的区别之一,因为 SQL 本身是以关系模型和集合论为基础的。
然而也有一些情况,我们不需要对查询结果集中的所有数据行都采用相同的处理方式,需要每次处理一行或者一部分行,这时就需要面向过程的编程方法了。游标就是这种编程方式的体现。如果你之前已经有了一些面向过程的编程经验,那么对于游标的理解也会比较容易。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了SQL中游标的概念及其应用。游标是一种面向过程的编程方式,允许逐条处理数据记录,与SQL面向集合的思维方式有所不同。文章详细介绍了游标的定义、打开、取数据、关闭和释放等常用步骤,并提供了使用游标解决常见问题的示例。通过游标,可以在结果集中逐行操作数据,实现个性化的处理需求。同时,文章也指出了使用游标可能带来的性能问题,以及在处理复杂数据情况下的灵活性。总的来说,游标为SQL语言增加了面向过程开发的能力,能够更精细、灵活地查询和管理数据行。文章内容深入浅出,适合读者快速了解游标在SQL中的重要性及使用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》,新⼈⾸单¥68
《SQL 必知必会》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(44)
- 最新
- 精选
- Y024面向集合思维方式的训练,有个在线的游戏,可以帮忙大家: www.setgame.com/puzzle/set.htm 关于面向集合的思考,《Oracle SQL高级编程》一书里有个专门的章节介绍: http://m.ituring.com.cn/article/472
作者回复: 多谢分享
2019-07-17224 - 夜路破晓简单理解就是把操作鼠标的动作用存储过程封装起来从而实现面对大批量数据重复操作的自动化。 这种情况我选择用编程比如python来解决,除非是那种有定期更新要求的定制宽表,可以考虑在定制宽表的基础加个游标以便实现自动化定期更新的要求。
作者回复: 对的
2019-07-177 - ABC老师这些例子是在MySQL的客户端命令行里面运行吗?在navicat里面运行好几个例子都没反应..
作者回复: 创建的话可以使用Navicat,运行命令的时候可以用MySQL客户端命令行
2019-07-1826 - 大斌我理解游标的作用: 在进行一些复杂计算的时候可以使用游标,因为自带的没有这么复杂的计算,需要自己进行定制, 我理解的面向过程和面向集合的编程方式的区别: 面向过程是结构化编程,是对解决问题步骤的分析 面向集合是属于抽象式的,把解决步骤模块化来复用
作者回复: 总结的不错
2019-07-225 - 林彦面向集合是通过属性来划分数据获取结果,面向过程是通过对每个/条数据进行处理。 请问老师文中提到的游标的比较常见的,或能避免其缺点的替代方式有哪些?有哪些场景又必须要用游标? 谢谢。
作者回复: 面向集合是一种思维方式,但有些时候 面向过程更容易处理一些具体的细节,比如各种条件判断等,这时就可以采用游标 来对具体的数据进行处理
2019-07-175 - 飞翔老师 游标是不是有防止内存被撑爆的作用, 比如要获取1百万条数据,假设直接都读取到内存中,内存搁不下,使用游标获取1百万条 貌似就没问题
作者回复: 相当于使用游标在内存中进行寻址,类似指针的作用
2019-09-244 - 冲再次回顾学习一次SQL,游标自我理解就想像鼠标的光标一样可以对每个数据进行扫描,可以到达每个数据的位置。总结游标的使用步骤定义游标,用变量接收游标是否结束,打开游标,游标中取得数据,关闭游标,释放游标。
作者回复: 对的 像鼠标的光标一样可以对每个数据进行扫描
2019-11-062 - 华夏IF temp_growth < 5 THEN IF temp_diff > 200 THEN SET temp_growth = temp_growth * 1.1; ELSEIF temp_diff >= 150 THEN SET temp_growth = temp_growth * 1.08; ELSEIF temp_diff < 150 THEN SET temp_growth = temp_growth * 1.07; END IF; ELSEIF temp_growth < 10 THEN SET temp_growth = temp_growth * 1.05; 条件判断也可以写成这样哈。因为上文if>200,elseif就默认<=200。后面同理。
作者回复: Good Job
2019-07-192 - Ronnyz在Navicat运行例子出现报错ERROR 1243,解决办法就是去掉 DEALLOCATE PREPARE cur_hero
作者回复: 对的
2019-07-241 - linus第一个示例报如下错,麻烦大佬瞅一下,给个回复,谢谢 [SQL]call calc_hp_max(10) [Err] 1318 - Incorrect number of arguments for PROCEDURE help.calc_hp_max; expected 0, got 1
作者回复: 使用 call calc_hp_max()
2019-07-193
收起评论