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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 数据库原理与应用(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
相关文章
|
7天前
|
存储 算法 Serverless
了解数据库中的布隆过滤器原理
【5月更文挑战第17天】本文介绍布隆过滤器是一种空间高效的的数据结构,用于判断一个元素是否可能在一个集合中。它包含一个位图和多个哈希函数。
31 1
了解数据库中的布隆过滤器原理
|
19天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
21 1
|
4天前
|
缓存 算法 关系型数据库
SQL DB - 关系型数据库是如何工作的
• 绿:O(1)或者叫常数阶复杂度,保持为常数(要不人家就不会叫常数阶复杂度了)。 • 红:O(log(n))对数阶复杂度,即使在十亿级数据量时也很低。 • 粉:最糟糕的复杂度是 O(n^2),平方阶复杂度,运算数快速膨胀。 • 黑和蓝:另外两种复杂度(的运算数也是)快速增长。 如果要处理2000条元素: • O(1) 算法会消耗 1 次运算 • O(log(n)) 算法会消耗 7 次运算 • O(n) 算法会消耗 2000 次运算
|
5天前
|
SQL 存储 大数据
济南sql数据库工程师
济南SQL数据库工程师是负责管理和维护SQL数据库的专业人员。以下是关于济南SQL数据库工程师的一些详细介绍: 一、岗位职责 1. 负责数据库日常巡检,及时反馈运行状况,并跟踪解决问题,确
46 21
|
5天前
|
SQL 监控 数据库
sql anywhere 数据库优化
\ Anywhere\对于任何数据库系统,优化都是持续的过程,旨在提高查询性能、减少资源消耗并确保数据的完整性和安全性。以下是一些建议,帮助您优化 SQL Anywhere 数据库: 1. **
41 5
|
5天前
|
SQL 监控 安全
sql数据库清除工具
在SQL数据库管理中,清理和优化数据库是一个重要的环节,特别是当数据库日志文件过大时。虽然没有特定的“SQL数据库清除工具”可以一键解决所有问题,但你可以使用多种方法和工具来清理SQL Server数
27 6
|
5天前
|
SQL 关系型数据库 MySQL
sql数据库命令
SQL(Structured Query Language,结构化查询语言)是用于管理关系数据库的标准编程语言。以下是一些常用的 SQL 数据库命令: 1. **创建数据库**: ``
26 7
|
5天前
|
SQL 存储 关系型数据库
sql建数据库
在SQL中,创建数据库的基本语法是使用`CREATE DATABASE`语句。以下是一个简单的示例,演示如何创建一个名为`mydatabase`的数据库: ```sql CREATE DA
22 0
|
5天前
|
SQL 存储 关系型数据库
sql 数据库教程
SQL数据库教程可以从以下几个方面进行介绍: 一、SQL概述与基本概念 SQL,全称Structured Query Language,即结构化查询语言,是用于管理关系型数据库的编程语言。
21 0
|
5天前
|
SQL JavaScript 前端开发
js链接sql数据库
在JavaScript中直接连接SQL数据库(如MySQL、PostgreSQL等)通常不是推荐的做法,特别是当JavaScript在客户端(如浏览器)中运行时。这是因为将数据库凭据暴露给客户端会导致
16 0