SQL使用游标

本文将讲授什么是游标,以及如何使用游标。

1. 游标

SQL 检索操作返回一组称为结果集的行,这组返回的行都是与 SQL 语句相匹配的行(零行到多行)。简单地使用 SELECT 语句,没有办法得到第一行、下一行或前 10 行。但这是关系 DBMS 功能的组成部分。

结果集(Result Set)SQL 查询所检索出的结果。

有时,需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

说明:SQLite 支持

SQLite 支持的游标称为步骤(step),本课讲述的基本概念适用于 SQLite 的步骤,但语法可能完全不同。

不同的 DBMS 支持不同的游标选项和特性。常见的一些选项和特性如下:

  1. 能够标记游标为只读,使数据能读取,但不能更新和删除。

  2. 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置和相对位置等)。

  3. 能标记某些列为可编辑的,某些列为不可编辑的。

  4. 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。

  5. 指示 DBMS 对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。

游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。

2. 使用游标

使用游标涉及几个明确的步骤:

  1. 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT 语句和游标选项。

  2. 一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT 语句把数据实际检索出来。

  3. 对于填有数据的游标,根据需要取出(检索)各行。

  4. 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的 DBMS)。

声明游标后,可根据需要频繁地打开和关闭游标。在游标打开时,可根据需要频繁地执行取操作。

2.1 声明游标

使用 DECLARE 语句创建游标,这条语句在不同的 DBMS 中有所不同。DECLARE 命名游标,并定义相应的 SELECT 语句,根据需要带 WHERE 和其他子句。为了说明,我们创建一个游标来检索没有电子邮件地址的所有顾客,作为应用程序的组成部分,帮助操作人员找出空缺的电子邮件地址。

下面是创建此游标的 DB2、MariaDB、MySQL 和 SQL Server 版本:

DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL;

下面是 Oracle 和 PostgreSQL 版本:

DECLARE CURSOR CustCursor
IS
SELECT * FROM Customers
WHERE cust_email IS NULL;

分析:在上面两个版本中,DECLARE 语句用来定义和命名游标,这里为 CustCursor。SELECT 语句定义一个包含没有电子邮件地址(NULL 值)的所有顾客的游标。定义游标之后,就可以打开它了。

2.2 使用游标

使用 OPEN CURSOR 语句打开游标,这条语句很简单,在大多数 DBMS 中的语法相同:

OPEN CURSOR CustCursor

分析:在处理 OPEN CURSOR 语句时,执行查询,存储检索出的数据以供浏览和滚动。现在可以用 FETCH 语句访问游标数据了。FETCH 指出要检索哪些行,从何处检索它们以及将它们放于何处(如变量名)。

2.3 关闭游标

游标在使用完毕时需要关闭。此外,SQL Server 等 DBMS 要求明确释放游标所占用的资源。下面是 DB2、Oracle 和 PostgreSQL 的语法:

CLOSE CustCursor

下面是 Microsoft SQL Server 的版本:

CLOSE CustCursor
DEALLOCATE CURSOR CustCursor

CLOSE 语句用来关闭游标。一旦游标关闭,如果不再次打开,将不能使用。第二次使用它时不需要再声明,只需用 OPEN 打开它即可。

3. 游标实例

以下是一个简单的示例,我们以 SQL Server 为例,说明如何使用游标。

场景:假设我们有一个员工表 Employees,表中包含 EmployeeID 和 Salary 两列。我们希望逐行处理每个员工的薪资,并给他们加薪 10%。

步骤

  1. 声明游标:首先,你需要声明一个游标,这个游标将关联一个查询。

  2. 打开游标:然后打开游标,这样 SQL Server 就会开始执行查询并返回结果集。

  3. 获取数据:通过游标逐行读取数据。

  4. 关闭游标:处理完所有数据后,关闭游标。

  5. 释放游标:最后,释放游标资源。

示例代码

-- 创建一个示例的员工表
CREATE TABLE Employees (EmployeeID INT,Salary DECIMAL(10, 2)
);-- 插入一些数据
INSERT INTO Employees (EmployeeID, Salary)
VALUES (1, 5000.00), (2, 6000.00), (3, 7000.00);-- 声明变量
DECLARE @EmployeeID INT, @Salary DECIMAL(10, 2);-- 声明游标
DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, Salary
FROM Employees;-- 打开游标
OPEN EmployeeCursor;-- 获取第一行数据
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @Salary;-- 循环遍历游标
WHILE @@FETCH_STATUS = 0
BEGIN-- 这里可以处理数据,例如给每个员工加薪UPDATE EmployeesSET Salary = @Salary * 1.1WHERE EmployeeID = @EmployeeID;-- 获取下一行数据FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @Salary;
END;-- 关闭游标
CLOSE EmployeeCursor;-- 释放游标
DEALLOCATE EmployeeCursor;-- 查看结果
SELECT * FROM Employees;

解释

1.声明游标

DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, Salary
FROM Employees;

这里声明了一个游标 EmployeeCursor,它将关联一个查询,查询所有员工的 EmployeeID 和 Salary。

2.打开游标:

OPEN EmployeeCursor;

打开游标开始执行查询。

3.获取数据

FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @Salary;

通过 FETCH NEXT 从游标中获取一行数据,并将 EmployeeID 和 Salary 存储到变量中。

4.处理数据

UPDATE Employees
SET Salary = @Salary * 1.1
WHERE EmployeeID = @EmployeeID;

对每一行数据执行加薪操作。通过更新语句将每个员工的薪水增加 10%。

5.循环和关闭游标

使用 WHILE @@FETCH_STATUS = 0 来继续处理每一行数据,直到游标中的所有数据都被处理完毕。最后,通过 CLOSE 和 DEALLOCATE 关闭并释放游标。

注意事项

  • 游标会消耗一定的系统资源,因此应该谨慎使用,特别是在数据量较大的情况下。

  • 在可能的情况下,应该使用 JOIN 或子查询等集合操作来替代游标,因为集合操作通常效率更高。

4. 小结

我们在本文讲解了什么是游标,为什么使用游标。你使用的 DBMS 可能会提供某种形式的游标,以及这里没有提及的功能。更详细的内容请参阅具体的 DBMS 文档。

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

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

相关文章

Redis - 5 ( 18000 字 Redis 入门级教程 )

一: 补充知识 1.1 渐进式遍历 Redis 使用 scan 命令以渐进式方式遍历键,避免了直接使用 keys 命令可能引发的阻塞问题。scan 的时间复杂度为 O(1),但需要多次执行才能完成对所有键的遍历,整个过程分步进行,有效减少阻…

22408操作系统期末速成/复习(考研0基础上手)

第一部分:计算题: 考察范围:(标红的是重点考) 第一章:CPU利用率: 第二章: 进程调度算法(需要注意不同调度算法的优先级和题目中给出的是否可以抢占【分为可抢占和不可抢占&#xff…

AI在电子制造中的应用:预测质量控制

一、 电子制造中存在的质量问题 电子制造过程中,由于生产工艺复杂、材料种类繁多、生产环境要求高等因素,可能会出现各种质量问题。 常见质量问题如下: 1. 空焊 原因:锡膏活性较弱、钢网开孔不佳、铜铂间距过大或大铜贴小元件、…

如何通过API实现淘宝商品评论数据抓取?item_review获取淘宝商品评论

前几天一个好朋友要我帮忙抓一下淘宝商品的评论数据,获取淘宝评论数据可以帮忙商家们做好市场调研,对自己的产品进行升级,从而更好地获取市场。我将详细爬取方法封装成API,以供方便调用。 item_review-获得淘宝商品评论 响应示例…

springboot550乐乐农产品销售系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统乐乐农产品销售系统信息管理难度大,容错率低&…

百度贴吧的ip属地什么意思?怎么看ip属地

在数字化时代,IP地址不仅是网络设备的唯一标识符,更承载着用户的网络身份与位置信息。百度贴吧作为广受欢迎的社交平台,也遵循相关规定,在用户个人主页等位置展示账号IP属地信息。那么,百度贴吧的IP属地究竟意味着什么…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介:从20世纪90年代开始,利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高,传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

element-plus大版本一样,但是小版本不一样导致页面出bug

npm 的版本 node的版本 npm的源这些都一样,但是效果不一样 发现是element的包版本不一样导致的 2.9.1与2.8.1的源是不一样的,导致页面出bug;

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…

《数据结构》期末考试测试题【中】

《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为?22. 单链表的存储密度比1?23.单链表的那些操作的效率受链表长度的影响?24.顺序表中某元素的地址为?25.m叉树第K层的结点数为?26. 在双向循环链表某节点…

华为数通考试模拟真题(附带答案解析)题库领取

【多选题】 管理员想要更新华为路由器的VRP版本,则正确的方法有? A管理员把路由器配置为FTP服务器,通过FTP来传输VRP软件 B:管理员把路由器置为FTP客户端,通过FTP来传输VRP软件 C:管理员把路由器配置为TFTP客户端,通过TFTP来传…

Linux:操作系统不朽的传说

操作系统是计算机的灵魂,它掌控着计算机的硬件和软件资源,为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中,Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…

前端(API)学习笔记(CLASS 4):进阶

1、日期对象 日期对象:用来表示事件的对象 作用:可以得到当前系统时间 1、实例化 在代码中发现了new关键字,一般将这个操作称为实例化 创建一个时间对象并获取时间 获得当前时间 const datenew Date() 使用日志查看,得到的…

【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)

Apple芯片 前言安装Homebrew安装uhd安装gnuradio使用b200mini安装好的路径下载固件后续启动频谱仪功能启动 gnu radio关于博主 前言 请参考本文进行安装,好多人买了Apple芯片的电脑,这种情况下,可以使用UHD吗?答案是肯定的&#…

SAP 01-初识AMDP(ABAP-Managed Database Procedure)

1. 什么是AMDP(ABAP-Managed Database Procedure) 1.)AMDP - ABAP管理数据库程序,是一种程序,我们可以使用SQLSCRIPT在AMDP内部编写代码,SQLSCRIPT是一种与SQL脚本相同的数据库语言,这种语言易于理解和编码。 将AM…

智能客户服务:科技如何重塑客户服务体验

在数字化时代,客户对于服务的需求和期望在不断演变。传统的客户服务模式已经难以满足现代消费者对于即时性、个性化和高效性的追求。随着人工智能、大数据、云计算等先进技术的蓬勃发展,智能客户服务应运而生,不仅重塑了客户服务的体验&#…

[论文笔记]Representation Learning with Contrastive Predictive Coding

引言 今天带来论文 Representation Learning with Contrastive Predictive Coding的笔记。 提出了一种通用的无监督学习方法从高维数据中提取有用表示,称为对比预测编码(Contrastive Predictive Coding,CPC)。使用了一种概率对比损失, 通过使用负采样使…

Kafka 消费者专题

目录 消费者消费者组消费方式消费规则独立消费主题代码示例(极简)代码示例(独立消费分区) offset自动提交代码示例(自动提交)手动提交代码示例(同步)代码示例(异步&#…

【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数

这个地方基本没有任何文档记录,在学习的过程中屡屡碰壁,因此记录一下这部分的内容,懒得看可以直接跳到总结看结论。 踩坑步骤 首先来看看书上让我们怎么写: //main.scala object Start {def main(args:Array[String]) {try {v…

数据分析思维(七):分析方法——群组分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…