SQL 自学:游标(Cursors)的理解与应用
在 SQL 中,游标(Cursor)是一种用于处理从数据库中检索出的多行数据的机制。它允许我们逐行地处理查询结果集,而不是一次性处理整个结果集。
一、游标是什么
游标可以看作是一个指向结果集的指针。通过游标,我们可以在结果集中进行行的遍历、提取特定行的数据,并对每行数据进行相应的操作。
二、如何使用游标
1、声明游标
在使用游标之前,首先需要声明游标。以下是一个示例:
DECLARE cursor_name CURSOR FOR select_statement;
其中,cursor_name
是游标名称,select_statement
是一个查询语句,它确定了游标所指向的结果集。
例如,如果我们有一个名为 employees
的表,包含 id
、name
和 salary
列,我们可以声明一个游标来获取所有员工的信息:
DECLARE emp_cursor CURSOR FOR SELECT id, name, salary FROM employees;
2、打开游标
声明游标后,需要打开游标才能开始使用它。使用 OPEN
语句打开游标:
OPEN cursor_name;
OPEN emp_cursor;
3、提取游标中的数据
使用 FETCH
语句从游标中提取数据。以下是一个基本的示例:
FETCH cursor_name INTO variable_list;
其中,variable_list
是用于存储从游标当前行提取的数据的变量列表。
例如:
DECLARE @emp_id INT, @emp_name VARCHAR(50), @emp_salary DECIMAL(10, 2);FETCH emp_cursor INTO @emp_id, @emp_name, @emp_salary;
在每次执行 FETCH
语句时,游标会指向下一行数据。如果已经到达结果集的末尾,FETCH
操作将返回 @@FETCH_STATUS = -1
。我们可以通过检查 @@FETCH_STATUS
的值来判断是否已经遍历完结果集。
4、关闭游标
当我们完成对游标的使用后,应该关闭游标以释放相关资源。使用 CLOSE
语句关闭游标:
CLOSE cursor_name;
CLOSE emp_cursor;
5、释放游标
关闭游标后,还可以使用 DEALLOCATE
语句释放游标所占用的内存:
DEALLOCATE cursor_name;
DEALLOCATE emp_cursor;
三、游标示例
假设我们有一个 orders
表,包含 order_id
、customer_id
和 order_amount
列。我们可以使用游标来计算每个客户的订单总额。
DECLARE @curr_customer_id INT, @total_amount DECIMAL(10, 2), @order_amount DECIMAL(10, 2);DECLARE order_cursor CURSOR FOR SELECT customer_id, order_amount FROM orders;OPEN order_cursor;FETCH NEXT FROM order_cursor INTO @curr_customer_id, @order_amount;WHILE @@FETCH_STATUS = 0
BEGINIF NOT EXISTS (SELECT 1 FROM @customer_amounts WHERE customer_id = @curr_customer_id)BEGINSET @total_amount = 0;ENDSET @total_amount = @total_amount + @order_amount;IF NOT EXISTS (SELECT 1 FROM @customer_amounts WHERE customer_id = @curr_customer_id)BEGININSERT INTO @customer_amounts (customer_id, total_amount)VALUES (@curr_customer_id, @total_amount);ENDELSEBEGINUPDATE @customer_amountsSET total_amount = @total_amountWHERE customer_id = @curr_customer_id;ENDFETCH NEXT FROM order_cursor INTO @curr_customer_id, @order_amount;
ENDCLOSE order_cursor;
DEALLOCATE order_cursor;-- 显示每个客户的订单总额
SELECT * FROM @customer_amounts;
在这个示例中,我们首先声明了一个游标来获取订单表中的客户 ID 和订单金额。然后,通过一个循环逐行读取数据,计算每个客户的订单总额,并将结果存储在一个临时表 @customer_amounts
中。最后,显示每个客户的订单总额。
再比如,我们有一个 students
表,包含 student_id
、name
和 grade
列。我们可以使用游标来找出每个年级的最高分数:
DECLARE @curr_grade INT, @max_grade DECIMAL(5, 2), @curr_student_grade DECIMAL(5, 2);DECLARE student_cursor CURSOR FOR SELECT grade, grade FROM students;OPEN student_cursor;FETCH NEXT FROM student_cursor INTO @curr_grade, @curr_student_grade;WHILE @@FETCH_STATUS = 0
BEGINIF @curr_grade IS NOT NULLBEGINIF NOT EXISTS (SELECT 1 FROM @max_grades WHERE grade = @curr_grade)BEGINSET @max_grade = @curr_student_grade;ENDELSEBEGINIF @curr_student_grade > @max_gradeBEGINSET @max_grade = @curr_student_grade;ENDENDUPDATE @max_gradesSET max_grade = @max_gradeWHERE grade = @curr_grade;ENDFETCH NEXT FROM student_cursor INTO @curr_grade, @curr_student_grade;
ENDCLOSE student_cursor;
DEALLOCATE student_cursor;-- 显示每个年级的最高分数
SELECT * FROM @max_grades;
这个示例中,游标用于遍历学生表中的年级和分数信息,计算每个年级的最高分数,并将结果存储在临时表 @max_grades
中,最后显示每个年级的最高分数。
四、游标使用的注意事项
1、游标通常在处理小型结果集时比较方便。对于大型结果集,使用游标可能会导致性能问题,因为它逐行处理数据,而不是像普通查询那样一次性处理整个结果集。
2、在使用游标时,要确保及时关闭和释放游标,以释放资源。
3、游标操作可能会增加数据库的开销,特别是在并发环境中,过多的游标使用可能会影响系统性能。
总之,游标是 SQL 中一种强大的工具,它允许我们更灵活地处理查询结果集。但在使用时,需要根据具体情况权衡其优缺点,选择最合适的方法来处理数据。
相关文章:

SQL 自学:游标(Cursors)的理解与应用
在 SQL 中,游标(Cursor)是一种用于处理从数据库中检索出的多行数据的机制。它允许我们逐行地处理查询结果集,而不是一次性处理整个结果集。 一、游标是什么 游标可以看作是一个指向结果集的指针。通过游标,我们可以在…...

IO多路复用概述与epoll简介
一、引言 在网络编程中,高并发的场景下处理大量连接请求是一项挑战。传统的阻塞式IO模型会让线程在等待数据的过程中陷入停顿,导致系统效率低下。为了解决这个问题,IO多路复用应运而生。它允许一个线程同时监听多个文件描述符(如…...

关于region_to_label算子的想法
1,定义:将区域进行编码 2,如何做到的:底层逻辑应该是paint_region。通过一个小的循环,按顺序将区域从灰度值1开始11的往上喷。 3,有什么作用:目前能用到的,是有字典的作用࿰…...

uni-app 实现好看易用的抽屉效果
在移动应用开发中,抽屉效果是一种常用的用户界面设计,它能有效地节省空间,同时提供导航和其他功能。本文将介绍如何在uni-app中实现一个好看且易用的抽屉效果,帮助你提升应用的用户体验。 一、什么是抽屉效果? 抽屉效…...

PowerShell 脚本 比较两文件差异(带粗狂进度条)并汇总输出
一上来就放代码 function Compare-FileHex {param ([Parameter(Mandatory$true)][string]$SourceFile,[Parameter(Mandatory$true)][string]$CompareFile,[Parameter(Mandatory$false)][string]$OutputFile,[Parameter(Mandatory$false)][int]$BufferSize 1MB)function Forma…...

学习 UE5 的一些前置操作总结
随着 Unity, Godot 这些引擎都玩抽象,主动捅自己一刀后,UE5 的风头不可谓不盛,本着多学一点免得失业的思路方针,咱也研究了一下 UE5 引擎,然后发现想要开始使用 UE5 ,包含了很多前置操作,这里总…...

C#/.NET/.NET Core技术前沿周刊 | 第 10 期(2024年10.14-10.20)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...

Git 基本配置
目录 打开 Git Bash设置用户信息查看配置信息修改电脑名字为常用指令配置别名打开用户目录,创建 .bashrc 文件在 .bashrc 文件中输入如下内容:打开gitBash,执行 source ~/.bashrc 解决GitBash乱码问题打开GitBash执行下面命令${git_home}/etc…...

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?
C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说,还是性价比很高的,具有很大的优势! 一、就业前景广阔 高需求行业 在当今数字化时代,计算机技术几乎渗透到了各个领域,无论是互联网…...

使用langchain和大模型API提取QA的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

Java面试场景题(1)---如何使用redis记录上亿用户连续登陆天数
感谢uu们的观看,话不多说开始~ 对于这个问题,我们需要先来了解一下~ 海量数据都可以用bitmap来存储,因为占得内存小,速度也很快 我大概计算了一下~ 完全够:String类型512M 1byte 8个bit位 8个状态 512M1024byt…...

Element UI
Element ui 就是基于vue的一个ui框架,该框架基于vue开发了很多相关组件,方便我们快速开发页面。 官网: https://element.eleme.io/#/zh-CN 安装Element UI vue init webpack element(项目名)确认项目是否构建成功:进入到项目的根路径 执行 npm start 访问 h…...

②PROFINET转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 Modbus TCP (接上一章) 配置使用 与 PROFINET 主站进行组态说明 这里介绍与西门子 PLC 的…...

python+Mosh网课笔记04
太久没写python代码了,学机器学习重新拾起python,笔记比较简陋。 参考:mosh python网课 一、导入同一文件夹下其他文件 first.py def swim():print("swim")def run():print("run")同一个文件夹下的second.py from f…...

【微服务】全面构建微服务监控体系:确保系统稳定与性能优化的关键
目录 引言一、微服务监控概述1.1 微服务监控的定义1.2 微服务监控的重要性1.3 监控的核心目标1.4 微服务监控的关键指标1.5 监控的策略 二、微服务监控的架构2.1 监控架构图2.2 架构组件2.3 监控架构示意图 三、微服务监控的工具3.1 工具概述3.2 Prometheus3.3 Grafana3.4 ELK …...

Gin框架操作指南08:日志与安全
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…...

鸿蒙系统 VS 安卓系统,谁将引领未来移动操作系统?
文章目录 1. 系统架构:微内核 vs 宏内核2. 设备生态:单设备 vs 全场景分布式3. 开发生态:安卓主导地位 vs 鸿蒙迅速崛起4. 性能与流畅度:安卓优化 vs 鸿蒙调度优势5. 安全性:Google 主导 vs 微内核高安全6. 市场影响力…...

PyTorch 中 functional.py 文件介绍
PyTorch PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等应用。它由 Facebook 的人工智能研究团队开发,并得到了许多研究机构和企业的支持。PyTorch 以其易用性、灵活性和强大的社区支持而受到欢迎。一些特点如下: 动态…...

SQL Injection | SQL 注入 —— 报错盲注
关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:报错盲注 —— 理论篇 报错盲注(Error-Based Blind SQL Injection)是一种常见的 SQL 注入技术,适用于那些页面不会直接显示后端处理结果的查询方式…...

网络通信与并发编程(四)操作系统、进程理论、开启进程的两种方式
多道技术、进程理论 文章目录 多道技术、进程理论一、操作系统1.1操作系统1.2操作系统中的常见概念1.3操作系统的发展史 二、进程理论2.1同步、异步、阻塞、非阻塞2.2 进程的层次结构2.3 运行态、阻塞态、就绪态 三、开启进程的两种方式3.1使用Process创建进程的两种方式3.2 父…...

Java--集合(三)之vectorlinkedlisthashset结构
文章目录 0.架构图1.vector解析2.LinkedList分析2.1源码分析2.2迭代器遍历的三种方式 3.set接口的使用方法3.1基本使用说明3.2基本遍历方式3.3HashSet引入3.4数组链表模拟3.5hashset扩容机制3.6hashset源码解读3.7扩容*转成红黑树机制**我的理解 0.架构图 1.vector解析 和之前介…...

upload-labs Pass-04
upload-labs Pass-04 在进行测试前,先了解一下.htaccess文件 .htaccess文件 .htaccess是Apache网络服务器一个配置文件,当.htaccess文件被放置在一个通过Apache Web服务器加载的目录中,.htaccess文件会被Apache Web服务器软件检测并执行&…...

如何修改jupyter notebook的工作目录
1.生成配置文件: 打开Anaconda Prompt,输入如下命令 jupyter notebook --generate-config 用代码可以找到配置文件位置,如果没有填y可以生成。 2.修改配置文件: 修改jupyter_notebook_config.py的配置文件,需将c.Not…...

23种设计模式具体实现方法
提示:文章 文章目录 前言一、背景二、设计模式1、代理模式2、适配器模式2.1 总结 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 最近 二、设计模式 1、代理模式 参考的这篇文章,代理模式(Proxy) 同时这篇文章还引用了另…...

cisco网络安全技术第3章测试及考试
测试 使用本地数据库保护设备访问(通过使用 AAA 中央服务器来解决)有什么缺点? 试题 1选择一项: 必须在每个设备上本地配置用户帐户,是一种不可扩展的身份验证解决方案。 请参见图示。AAA 状态消息的哪一部分可帮助…...

数据结构练习题5(链表和栈)
1环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测…...

计算机网络408真题解析(湖科大教书匠)
09年...

uniapp+vue3+uview-plus修改默认样式
最近使用uniappvue3uview-plus开发微信小程序中,使用uview-plus自定义底部导航栏tabbar时,遇到修改默认样式不生效问题 使用传统的 ::v-deep、:deep、::v-deep,或者style标签中去掉scoped也是无效的,有好的方案欢迎交流ÿ…...

数控机械制造工厂ERP适用范围有哪些
在当今制造业高速发展的背景下,企业资源计划(ERP)系统已成为提升工厂管理效率、实现生产自动化与信息化的关键工具。特别是对于数控机械制造工厂而言,一个合适的ERP系统能够帮助其优化生产流程、提高产品质量、降低生产成本并增强市场竞争力。 1. 生产计…...

华为配置 之 Console线路配置
目录 简介: 知识点: 配置Console线路密码 1.密码认证模式 2.AAA认证模式 知识点: 总结: 简介: 使用PC模拟器与路由器相连(与交换机相连原理一样),在关机状态下,使用…...