数据库原理与应用(SQL Server)笔记 第十一章 游标

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 数据库原理与应用(SQL Server)笔记 第十一章 游标

前言


本章内容将从六个方面介绍关于游标的知识,分别是其定义、声明、打开、使用、关闭、删除,另外还会介绍静态游标和动态游标。


一、游标的定义


当对由SELECT语句返回的结果集中的某一行或部分行进行单独处理时,就要用到一种扩展,也就是游标,游标提供了对一个结果集进行逐行处理的能力。

游标可以保存查询结果,方便下文调用,因为使用游标会保存数据行的副本,在创建游标后,下文查询即可从副本中查询,比直接查数据库快很多。


二、游标的声明


游标包括两部分,一是游标结果集,即是由SELECT语句返回的结果集的集合,二是游标当前行指针,即指向该结果集中某一行的指针。

声明游标使用DECLARE CURSOR语句,格式如下:

DECLARE <游标的名称>(INSENSITIVE)(SCROLL)CURSOR
/*INSENSITIVE表示对基表的任何改动都不会影响到游标数据中,且表示游标是只读的,不允许修改,也不能通过它修改基表的数据。*/
/*SCROLL表示使用所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE),若不指定只能使用NEXT提取选项。*/
FOR 
<SELECT 语句>


三、游标的打开


当游标被打开时,其游标位置位于第一行。

打开游标使用OPEN语句,格式如下:

OPEN (GLOBAL)<游标的名称>
/*GLOBAL表示打开的是全局游标,否则打开的是局部游标*/


四、游标的使用


使用FETCH语句使游标来提取数据,格式如下:

FETCH NEXT/PRIOR/FIRST/LAST/RELATIVE n/ABSOLUTE n FROM (GLOBAL)<游标的名称>
(INTO <变量的名称>)
/*INTO表示将读取的游标数据存放到指定的变量中,后跟变量的名称*/


这里的NEXT/PRIOR/FIRST/LAST/RELATIVE n/ABSOLUTE n用于表示游标读取数据的位置。

(1)NEXT表示读取游标中当前行的下一行,且将其作为当前行;

(2)PRIOR表示读取游标中当前行的前一行,且将其作为当前行;

(3)FIRST表示读取游标中的第一行,且将其作为当前行;

(4)LAST表示读取游标中的最后一行,且将其作为当前行;

(5)RELATIVE n表示读取游标的当前行的前或后n行,若n>0,则读取游标当前行起向后的第n行数据,若n<0,则读取游标当前行起向前的第n行数据,且将其作为当前行;

(6)ABSOLUTE n表示读取游标从第一行或最后一行开始的第n行,若n>0,则读取从结果集的第一行(包括第一行)起向后的第n行,若n<0,则读取从结果集的最后一行起向前的第n行,且将其作为当前行。


五、游标的关闭


关闭游标使用CLOSE语句,格式如下:

CLOSE <游标的名称>


六、游标的删除


在关闭游标后,要释放其占用的系统空间,删除游标使用DEALLOCATE语句,格式如下:

DEALLOCATE <游标的名称>


例1、根据下表信息,在数据库Sales中,定义一个游标CURSOR_0求商品信息表第一行的商品信息。

1667042047992.jpg

> sql语句:

USE Sales DECLARE CURSOR_0 CURSOR FOR SELECT* FROM Product OPEN CURSOR_0 FETCH NEXT FROM CURSOR_0 CLOSE CURSOR_0 DEALLOCATE CURSOR_0

1667042059357.jpg

例2、根据信息,在数据库Sales中,定义一个游标CURSOR_3求销售员信息表员工的工号、姓名、性别、住址、电话信息。

1667042071056.jpg

这里使用了WHILE语句,其条件表达式中采用的@@FETCH_STATUS函数返回上一条游标FETCH语句的状态,当返回值为0,循环继续进行,否则退出循环,从而达到求销售员信息表的员工信息。

sql语句:

USE Sales DECLARE @SaleID char(3),@Salename varchar(20),@Sex char(2), @Address varchar(60),@Telephone varchar(20) DECLARE CURSOR_3 CURSOR FOR SELECT SaleID,Salename,Sex,Address,Telephone FROM Seller OPEN CURSOR_3 FETCH NEXT FROM CURSOR_3 INTO @SaleID,@Salename,@Sex,@Address,@Telephone PRINT '工号 姓名 性别 住址 电话' PRINT '-------------------------------------------' WHILE @@FETCH_STATUS=0 BEGIN PRINT @SaleID+' '+@Salename+' '+@Sex+' '+@Address+' '+@Telephone FETCH NEXT FROM CURSOR_3 INTO @SaleID,@Salename,@Sex,@Address,@Telephone END CLOSE CURSOR_3 DEALLOCATE CURSOR_3

1667042101627.jpg


七、静态游标和动态游标


SQL Server支持的API服务器游标分为一下4种,分别是静态游标、动态游标、只进游标和键集驱动游标,这里只介绍前两种游标。

1、静态游标,即只有NEXT操作。


/SCROLL表示使用所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE),若不指定只能使用NEXT提取选项。/


上面例1、2定义的即是静态游标。

2、动态游标,有多种操作(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)。


例3、根据下表信息,在数据库Sales中,定义一个游标CURSOR_1求商品信息表最后一行的商品信息。

1667042120379.jpg

这里因为求得最后一行信息即要使用LAST,所以要在CURSOR前面加SCROLL,使其变为动态游标。

sql语句:

USE Sales DECLARE CURSOR_1 SCROLL CURSOR FOR SELECT * FROM Product OPEN CURSOR_1 FETCH LAST FROM CURSOR_1 CLOSE CURSOR_1 DEALLOCATE CURSOR_1

1667042147865.jpg


例4、根据例3信息,在数据库Sales中,定义一个游标CURSOR_2分别求商品信息表中最后一行、游标当前行起前的第3行数据、游标当前行的前一行、表中第一行起向后的第2行、表中的第一行的数据。

sql语句:

USE Sales DECLARE CURSOR_2 SCROLL CURSOR FOR SELECT * FROM Product OPEN CURSOR_2 FETCH LAST FROM CURSOR_2 --读取表中最后一行,且将其作为当前行 FETCH RELATIVE -3 FROM CURSOR_2 --读取游标当前行起前的第3行数据,且将其作为当前行 FETCH PRIOR FROM CURSOR_2 --读取游标当前行的前一行,且将其作为当前行 FETCH ABSOLUTE 2 FROM CURSOR_2 --读取表中第一行起向后的第2行,且将其作为当前行 FETCH FIRST FROM CURSOR_2 --读取表中的第一行,且将其作为当前行 CLOSE CURSOR_2 DEALLOCATE CURSOR_2

1667042164552.jpg


结语


以上就是本次数据库原理与应用的全部内容,篇幅较长,感谢您的阅读和支持,若有表述或代码中有不当之处,望指出!您的指出和建议能给作者带来很大的动力!!!


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
21 11
|
1天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
29 6
|
11天前
|
数据库 Windows
SqlServer数据恢复—SqlServer数据库所在分区损坏的数据恢复案例
一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer数据库数据。
|
1月前
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
196 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
1月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
72 11
|
28天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
2月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
1月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
1月前
|
SQL 数据挖掘 数据库
SQL自学笔记(2):如何用SQL做简单的检索
本文深入介绍了SQL的基本语法,包括数据查询、过滤、排序、分组及表连接等操作,并通过实际案例展示了SQL在用户研究中的应用,如用户行为分析、用户细分、用户留存分析及满意度调查数据分析。
39 0
SQL自学笔记(2):如何用SQL做简单的检索