SQL 自学:游标(Cursors)的理解与应用

在 SQL 中,游标(Cursor)是一种用于处理从数据库中检索出的多行数据的机制。它允许我们逐行地处理查询结果集,而不是一次性处理整个结果集。

一、游标是什么

游标可以看作是一个指向结果集的指针。通过游标,我们可以在结果集中进行行的遍历、提取特定行的数据,并对每行数据进行相应的操作。

二、如何使用游标

1、声明游标

在使用游标之前,首先需要声明游标。以下是一个示例:

DECLARE cursor_name CURSOR FOR select_statement;

其中,cursor_name 是游标名称,select_statement 是一个查询语句,它确定了游标所指向的结果集。

例如,如果我们有一个名为 employees 的表,包含 idname 和 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_idcustomer_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_idname 和 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 中一种强大的工具,它允许我们更灵活地处理查询结果集。但在使用时,需要根据具体情况权衡其优缺点,选择最合适的方法来处理数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合框架07:LinkedList使用

1.视频链接:13.14 LinkedList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p142.LinkedList集合的增删改查操作 package com.yundait.Demo01;im…

【判断推理】逻辑论证之归因论证

2.1 归因论证概述 归因:指人们对 他人或自己行为的原因的推论过程。具体而言,就是观察者对他人的行为过程或自己的行为过程所进行的因果解释和推论。(通俗而言,归因就是对已经发生的事实,在众多可能的原因中找出一个原…

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦

背景 接上一篇,【大模型问答测试】大模型问答测试脚本实现(第一版)。 在实现自动化的时候,原先把很多方法与request请求写在一块了,趁着目前实现接口数量较少,决定对代码进行解耦,并且清晰目录…

Qt获取磁盘信息+表格显示

效果展示 主要代码 获取磁盘相关数据 获取磁盘数据 Qt 没有提供相关的接口,需要使用 Windows API。接口解释如下: BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailable…

推荐算法的学习

文章目录 前言1、模型1.1 从本领域模型的发展历史中学习1.1.1 在历史中总结发展规律和趋势1.1.2 发现模型之间的共性,方便记忆 1.2 从其他领域的发展中学习1.2.1 注意力机制1.2.2 残差网络 1.3 实践该怎么办? 2、 特征2.1 数据源的选择与建立2.2 特征构造…

Python生成随机密码脚本

引言 在数字化时代,密码已成为我们保护个人信息和数据安全的重要手段。然而,手动创建复杂且难以猜测的密码是一项既繁琐又容易出错的任务。幸运的是,Python编程语言为我们提供了一种高效且灵活的方法来自动生成随机密码。本文将详细介绍如何…

android app执行shell命令视频课程补充android 10/11适配-千里马android

(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi,有学员在学习跨进程通信专题课程时候,在实战app执行一个shell命令的项目时候,对课程本身的android …

【高等数学】无穷级数

0. 了解 无穷级数是指将无穷多个数按照一定的规律相加起来的表达式。 打个比方,就像你有一个无穷长的梯子,每一级梯子代表一个数。把这些数一个一个加起来,就形成了无穷级数。 比如常见的等比级数,这里是首项,是公比。如果,这个等比级数是收敛的,也就是它的和是一个有限…

Hackmyvm-Lookup

0x00信息收集 0x01端口扫描 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http MAC Address: 08:00:27:0A:44:CF (Oracle VirtualBox virtual NIC)22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)80/tcp open http Apache ht…

数据权限的设计与实现系列13——前端筛选器组件Everright-filter集成多控制维度实现

‍ 数据权限多维度实现 上面的所有工作,实际都是基于业务实体属性这一数据权限控制维度展开的。 接下来,我们来设计与实现多维度,主要是用户组(即角色)、组织机构和用户。 ‍ 业务需求分析 用户控制维度 业务场景…

【MATLAB代码】指纹定位方法(KNN)介绍与例程(二维、轨迹定位),源代码可复制粘贴到MATLAB上运行

文章目录 指纹定位指纹定位技术简介基本原理位置估算公式1. 最近邻居算法(KNN)2. 加权最近邻居算法(W-KNN)3. 最小二乘法(LS)最终位置 P P P通过求解下面的方程获得:应用场景优缺点优点缺点总结源代码代码运行运行方法运行结果指纹定位 指纹定位技术简介 指纹定位是一…

SpringBoot日常:封装redission starter组件

文章目录 逻辑实现POM.xmlRedissionConfigRedissionPropertiesRedissionUtilsspring.factories 功能测试application.yml配置POM.xmlTestController运行测试 本章内容主要介绍如何通过封装相关的redission连接配置和工具类,最终完成一个通用的redission starter。并…

洛谷 P1038 [NOIP2003 提高组] 神经网络(拓扑排序)

题目传送门 感觉这道题需要我们高超的语文阅读水平…… 解题思路 我们发现要计算一个细胞的状态值(),就需要先算出有边指向它的其他细胞对答案的贡献; 这是有拓扑序的,所以我们想到拓扑排序。 题目中说了&#xff0…

FastDFS单节点部署

FastDFS单节点部署 1、FastDFS入门1.1 分布式文件系统1.2 FastDFS 简介1.3 FastDFS 发展历史1.4 FastDFS 整体架构1.5 FastDFS 线上使用者 2、FastDFS 环境搭建2.1 FastDFS 安装2.1.1 安装前的准备2.1.2 安装 libfastcommon库2.1.3 安装 FastDFS 2.2FastDFS 配置2.2.1 去掉/etc…

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域,MetaTrader是一款备受欢迎的交易软件,包括MT5和MT4,提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言,编写专家顾问(EA)可能显得既复杂又令人望而却步。幸运的是&…

数据结构——链表,哈希表

文章目录 链表python实现双向链表复杂度分析 哈希表(散列表)python实现哈希表哈希表的应用 链表 python实现 class Node:def __init__(self, item):self.item itemself.next Nonedef head_create_linklist(li):head Node(li[0])for element in li[1…

spring6 IoC容器详解

目录 一、引言 示例开发 示例分析 启用Log4j2日志框架 使用方式 二、IoC容器 IoC容器 1.控制反转(IoC) 2.依赖注入 3.IoC容器在Spring的实现 基于XML管理Bean 依赖注入之setter注入 依赖注入之构造器注入 Bean生命周期 基于xml自动装配 …

基于SSM+微信小程序的打印室预约管理系统(打印2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的打印室预约管理系统实现了管理员和用户两个角色。 1、管理员功能有个人中心,用户管理,附近打印店管理,文件打印管理,当…

ui自动化知识点-web端

UI : User Interface( ⽤户接⼝ - ⽤户界⾯ ) ,主要包括: app 、 web ui ⾃动化测试:使⽤⼯具或代码执⾏⽤例的过程 什么样的项⽬适合做⾃动化:1、需要回归测试项⽬(甲⽅⾃营项⽬、⾦融、电商)2、需求变动不频繁:稳定的模块3、项⽬周期⻓的项⽬:(甲⽅⾃营项⽬、6个…

YOLO11改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文给大家带来的教程是将YOLO11的backb…