SQL -- 游标(详细)
文章目录
- 一 、概述
- 1-1 游标基本概念
- 1-2 游标的实现功能及使用步骤
- 二、语法 T-SQL
- 1-1 声明游标
- 1-2 打开游标
- 1-3 读取游标
- 1-4 关闭游标
- 1-5 删除游标
- 三、 创建举例用的数据库及表
一 、概述
1-1 游标基本概念
什么是游标
游标是一种处理数据的方法,具有对结果集进行逐行处理的能力。
可以将游标看作一种特殊的指针,它与某个查询结果集相关联,可以指向结果集的任意位置,可以将数据放在数组、应用程序中或其他的地方,允许用户对指定位置的数据进行处理。
为什么使用游标
- 出来 SELECT 的 WHERE 可以限制一条记录被选中外,T-SQL 没有提供查询表中单条记录的方法,但我们常常会遇到需要逐行读取记录的情况。
- 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序往往采取非数据库语言(如 C#、VB、ASP或其他开发工具)内嵌T-SQL的形式来开发,而这些非数据库语言无法将表作为一个单元来处理,因此,这些应用程序需要一种机制以便每次处理一行或一部分行。
1-2 游标的实现功能及使用步骤
游标的实现功能
- 允许对 SELECT 返回的表中的每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;
- 从表中的当前位置检索一行或多行数据;
- 游标允许应用程序对当前位置的数据进行修改、删除的能力;
- 对于不同用户对结果集包含的数据所做的修改,支持不同的可见性级别;
- 提供脚本、存储过程、触发器中用于访问结果集中的数据的语句。
游标的使用步骤:前4个步骤是必须的。
- 声明游标 DECLARE:将游标与 T-SQL 语句的结果集相关联,并定义游标的名称、类型和属性,如游标中的记录是否可以更新、删除
- 打开游标 OPEN:执行 T-SQL 语句以填充数据。
- 读取游标 FETCH:从游标的结果集中检索想要查看的行,进行逐步操作。
- 关闭游标 CLOSE:停止游标使用的查询,但并不删除游标的定义,可以使用 OPEN 再次打开。
- 释放游标 DEALLOCATE:删除资源并释放其占用的所有资源。
二、语法 T-SQL
1-1 声明游标
声明游标是指用 DECLARE 语句创建一个游标。声明游标主要包括以下内容:游标名称、数据来源、选取条件和属性。
声明游标语法格式
DECLARE 游标名称 CURSOR
[ LOCAL | GLOBAL ] --游标的作用域
[ FORWORD_ONLY | SCROLL ] --游标的移动方向
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] --游标的类型
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] --游标的访问类型
[ TYPE_WARNING] --类型转换警告语句
FOR SELECT 语句 --SELECT查询语句
[ FOR { READ ONLY | UPDATE [OF 列名称]}][,...n] --可修改的列
举例:
要求:创建游标 curl,使 curl 可以对 student 表所有的数据进行操作,并将游标变量 @var_curl 与 curl相关联。
声明游标 T-SQL 语句
-- 声明游标
DECLARE curl CURSOR
FOR SELECT * FROM student
DECLARE @var_curl CURSOR
SET @var_curl=curl
1-2 打开游标
游标声明后,如果要从游标中读取数据必须要打开游标。打开游标是指打开已经声明但尚未打开的游标,并执行游标中定义的查询。
- 如果声明游标使用 STATIC 类型,则 打开游标时产生一个临时表来存放结果集;
- 如果声明游标使用 KEYSET 类型,则 OPEN 产生一个临时表来存放键值。
- 所有的临时表都存放在 tempdb 数据库中。
打开游标语法格式
OPEN 游标名称
在游标被成功打开后,全局 变量 @@CORSOR_ROWS 用来记录游标内的数据行数。返回值有四种:
返回值 | 描述 |
---|---|
-m | 表示仍在从基础表向游标读入数据,m表示当前在游标中的数据行数 |
-1 | 该游标是一个动态游标,其返回值无法确定 |
0 | 无符合调剂的记录或游标已经关闭 |
n | 从基础表向游标读入数据已结束,n 为游标中已有的数据记录行数 |
举例:
要求:创建游标 curl,使 curl 可以对 student 表所有的数据进行操作,然后打开该游标,输出游标中的行数。
打开游标 T-SQL 语句
-- 打开 curl 游标
OPEN curl
SELECT '游标curl数据行数' =@@CURSOR_ROWS
执行结果
1-3 读取游标
当游标打开后就可以使用 FETCH 命令从游标中逐行地读取数据,以进行相关处理。
读取游标语法格式
FETCH
[[ NEXT | PRIOR | FIRST | LAST | ABSOLUTE{n|@nvar }| RELATIVE { n|@nvar }] FROM ] -- 读取数据的位置
{{[ GLOBAL] 游标名称} | @游标变量名称 }
[ INTO @游标变量名称 ][,...n] -- 将读取的游标数据存放到指定变量中
FETCH语句执行时,可以使用 全局变量 @@FETCH_STATUS 返回上次执行 FETCH 命令的状态。在每次用 fetch 从游标中读取数据时,都应检查该变量,以确定上次 FETCH操作是否成功,来决定如何进行下一步处理。返回值有三种:
返回值 | 描述 |
---|---|
0 | FETCH命令被成功执行 |
1 | FETCH命令失败或者行数据超过游标数据结果集的范围 |
2 | 所读取的数据已经不存在 |
举例:
要求:创建游标 curl,从游标中提取数据,并查看 FETCH 命令的执行状态。
读取游标 T-SQL 语句
-- 读取curl 数据
FETCH NEXT FROM curl
SELECT 'NEXT_FETCH执行情况'=@@FETCH_STATUS
执行结果
1-4 关闭游标
游标使用完以后要及时关闭。关闭游标使用 CLOSE ,但不释放游标占用的资源。
关闭游标语法格式
CLOSE {{[ GLOBAL] 游标名称} | @游标变量名称 }
举例:
要求:关闭游标 curl。
关闭游标 T-SQL 语句
-- 关闭游标
CLOSE curl
1-5 删除游标
游标关闭后定义还在,需要时可以再使用 OPEN 打开游标继续使用。若确定不再使用则使用 CLOSE 删除游标,释放占用系统中的资源。
删除游标语法格式
DEALLOCATE {{[ GLOBAL] 游标名称} | @游标变量名称 }
举例:
要求:删除游标 curl。
关闭游标 T-SQL 语句
-- 删除游标
DEALLOCATE curl
三、 创建举例用的数据库及表
创建举例用的数据
- 创建StuInfo数据库,若存在则直接使用
- 创建student表,若已存在删除后创建
- 插入数据
可以将下方SQL语句 复制到 SSMS 工具上直接执行,如果有时间,建议自己敲一遍。扩展一点,SQL语句关键字最好使用大写。如果使用小写,数据库会将关键字从小写转换为大写,增加这一过程则性能会降低,所以最好直接使用大写。
use master
go
-- 判断数据库是否已经存在,若存在不删除直接使用,反之新建
IF EXISTS(SELECT * FROM sysdatabases WHERE name='StuInfo') PRINT 'StuInfo数据库已存在'
ELSE
BEGIN--创建数据库CREATE DATABASE StuInfoON(NAME=StuInfo,FILENAME='D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\StuInfo.mdf',SIZE=3MB,MAXSIZE=UNLIMITED,FILEGROWTH=10%)LOG ON(NAME=StuInfo_log,FILENAME='D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\StuInfo_log.ldf',SIZE=1MB,MAXSIZE=100MB,FILEGROWTH=10%)
END
GOUSE StuInfo
GO
-- 判断数据表是否已经存在,若存在删除后创建
IF OBJECT_ID(N'StuInfo..student',N'U') IS NOT NULLDROP TABLE studentCREATE TABLE student
(
[s_id][char](10)NOT NULL,
[sname][nvarchar](5)NULL,
[ssex][nvarchar](1)NULL,
[sbirthday][date]NULL,
[sdepartment][nvarchar](10)NULL,
[smajor][nvarchar](10)NULL,
[spoliticalStatus][nvarchar](4)NULL,
[phoneName][varchar](100)NULL,
[photo][varchar](max)NULL,
[smemo][nvarchar](max)NULL,
CONSTRAINT[PK_student]PRIMARY KEY CLUSTERED
([s_id] ASC
))on [PRIMARY]
GO-- 向数据库添加数据
USE StuInfo
INSERT INTO
student ([s_id],[sname],[ssex],[sbirthday],[sdepartment],[smajor],[spoliticalStatus],[photo],[smemo])
VALUES
('20070101',N'张莉',N'女','1/30/1998',N'信息工程学院',N'计算机',N'党员',NULL,NULL)
,
('20070102',N'张建',N'男','1/30/1998',N'信息工程学院',N'计算机',N'党员',NULL,NULL)
GO
SQL -- 游标(详细)相关推荐
- sql游标 while_用SQL Server中的排名函数替换SQL While循环和游标,以提高查询性能
sql游标 while SQL While loop and cursor are the most common approach to repeat a statement on conditio ...
- Library Cache优化与SQL游标
点击查看全文 Dear 跟着小编一起读好书运动开始啦!咱们作为DBA不仅要外部打扮自己,更要从内部武装.近期,小编将分享冷菠老师的<Oracle高性能自动化运维>一部分精选章节分享给大家. ...
- 如何创建和使用 SQL 游标
文章目录 一.游标 二.使用游标 2.1 创建游标 2.2 使用游标 2.3 关闭游标 三.小结 本文介绍什么是 SQL 游标,为什么使用游标,如何使用游标.你使用的 DBMS 可能会提供某种形式的游 ...
- SQL 游标使用示例
SQL游标(cursor)详细说明及内部循环使用示例 定义 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取 ...
- PL/SQL 游标
本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...
- SQL游标的使用与语法
2019独角兽企业重金招聘Python工程师标准>>> 以[master].[dbo].[spt_values] 这个表为例子 === declare @name nvarchar( ...
- 查看你某条sql是哪个用户执行的_django_debug_toolbar:查看访问某个页面执行sql的详细...
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能,包括查看执行的sql语句,db查询次数,request,headers,调试概览等. 1.官方推荐 ...
- sql replace替换多个字符_牛客网数据库SQL实战详细剖析(4150)
文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程.具体题目可参考牛客网的SQL实战模块:https://www.nowcoder ...
- SQL游标原理和使用方法(转)
SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...
- [Oracle] SQL*Loader 详细使用教程(3)- 控制文件
控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件. 在控制文件里配置 ...
最新文章
- mysql insert 主键冲突_insert 时防止出现主键冲突错误的方法
- Python-学习-import语句导入模块
- java技术简介英文_Java技术常见的英文缩写
- 句向量的表示(上)—无监督
- 如何执行一段java代码_V8 之 如何执行一段 JavaSscript 代码
- 苹果企业账号炒作到多少钱_从炒作到行动:边缘计算的后续步骤
- html日期自动更新,原生javascript实现自动更新的时间日期_javascript技巧
- 2.1.PHP7.1 狐教程-【PHP基础】
- AssetBundle资源冗余检测
- Flash中的计时器
- 史上最通俗易懂的YOLOv2讲解
- 【MySQL】 锁机制:InnoDB引擎中锁分类以及表锁、行锁、页锁详解
- 小红书投放怎么变现?品牌做小红书的变现效果好吗
- 2018 11.2 PION模拟赛
- QQ看点模块思维导图
- 【类和对象】深入浅出类和对象
- 275、Java基础51 - 数字与字符串【格式化输出】 2019.11.21
- 外卖cps淘宝客如何实现用户与订单的绑定(附外卖cps带分销返利源码)
- Windows Phone开发基础(10)Visifire 使用详解之 AxisLabels
- github创建账号第一步始终出错
热门文章
- 初入社会要避免入的坑-租房篇
- 使用树莓派+arduino+采集卡+frp实现异地控制电视机顶盒
- linux dd nand,uboot 中 Nand flash 常用操作命令解释
- Google Chrome浏览器JS调试工具
- 51单片机c语言编程100,51单片机C语言编程100例.doc
- C语言中,声明和定义的区别
- 谈谈对Spring IOC(控制反转)的理解--转
- 微信小程序使用echarts绘画动态图表
- oracle orion测试工具的使用
- Xz1android9打电话延迟,索尼Xperia XZ与XZ1系列正式获得Android 9升级;但这新