导学
游标算是SQLSERVER里面的进阶知识了,第一眼看了可能觉得复杂,这是正常的,但是其实游标有固定的格式,记住格式之后就简简单单了,让我们开始吧!
游标的作用
以前我们获取数据的方式是通过SELECT * FROM XX获取,而这样的结果是数据库一次性输出一张表,但是如果我们想要数据库一行一行的输出结果呢?
这时候游标的作用就凸显出来了,游标可以让数据库一行一行的输出结果。但是我们用游标的根本原因并不是仅仅让它一行一行输出,我们可以在它逐行输出的同时,可以加上我们的处理,比如符合要求的行保留,不符合则剔除之类,而这就是游标的用法,而这就类似于对数据库查询结果的遍历。如果还不清楚我们可以继续往下看代码和例子。
游标的代码
游标的代码,第一次看很繁琐,但是实际上就是一个模板而已,用的时候复制一下就行,看一眼之后可以往下看例子。
DECLARE 游标名 CURSOR FOR --这里声明游标,标注游标的名字
SELECT 列1,列2 FROM ... --这个是游标处理的语句和数据源,也就是用游标对这个查询结果进行一行一行的处理。
OPEN 游标名 --开启游标
DECLARE @变量1 变量类型 --用于接收游标的获取值,这里对应SQL语句中,获取的列的数量,获取几个列的数量就声明几个变量。
DECLARE @变量2 变量类型 --用于接收游标的获取值,这里对应SQL语句中,获取的列的数量,获取几个列的数量就声明几个变量。
FETCH NEXT FROM 游标名 INTO @变量1,@变量2 --游标开始遍历一行,并把数据保存到@变量1,@变量2,......中,这里的顺序需要对应select中列的顺序。
WHILE @@FETCH_STATUS = 0 -- @@FETCH_STATUS这个变量用于判断是否正常获取数据,如果能正常获取数据,则结果为0,则继续执行游标遍历语句,当数据获取异常的时候,结束遍历。
BEGIN
... --这里用于对数据的处理,主要的数据判断处理操作就是在这里进行。
FETCH NEXT FROM 游标名 INTO @变量1,@变量2 --游标继续遍历
END
CLOSE 游标名 --关闭游标
DEALLOCATE 游标名 --删除游标
上面的格式就是最简单的游标格式,也是最常用的游标格式,记住上面的就能解决大部分的问题,接下来我们继续进行讲解,同时介绍一些例子。
游标的示例
先准备一张数据表
CREATE TABLE Students
(
name VARCHAR(20) ,
class VARCHAR(20) ,--需要多少列,就添加多少行
)
INSERT INTO Students VALUES('张三', '五班')
INSERT INTO Students VALUES('李四', '四班')
INSERT INTO Students VALUES('王五', '一班')
name | class |
---|---|
张三 | 五班 |
李四 | 四班 |
王五 | 一班 |
需求:
如果是五班的同学,则输出姓名,并标注为‘全英班’,不是五班的则输出名字并修改为‘传统班’。
这时候我们用游标就可以这样处理:
DECLARE student_cursor CURSOR FOR --声明一个名字为student_cursor的游标
SELECT name,class from Students --遍历的SQL语句
OPEN student_cursor --打开游标
DECLARE @name varchar(20) --声明名字为name,类型为字符型的变量。
DECLARE @class varchar(20) --声明名字为class,类型为字符型的变量。
FETCH NEXT FROM student_cursor INTO @name,@class --获取student_cursor的一条数据,其中为两个字段分别赋值给@name,@class
WHILE @@FETCH_STATUS=0 --假如检索到了数据继续执行游标,如果没有数据则判断失效,结束遍历
BEGIN
IF @class = '五班' --判断,如果班级字段等于五班,则输出全英班,不等于则输出传统班
PRINT('全英班')
ELSE
PRINT('传统班')
PRINT(@name)
FETCH NEXT FROM student_cursor INTO @name,@class --获取下一条数据并赋值给变量
END
CLOSE student_cursor --关闭游标,但是还存在游标这个变量
DEALLOCATE student_cursor --删除游标
执行结果:
全英班
张三
传统班
李四
传统班
王五
当你能成功理解和运行上述代码的时候,就说明你已经掌握了游标常用的使用场景,也掌握了SQLSERVER的一个高级语法。当然游标还有进阶的内容,也将在之后推出,如果有兴趣学习,可以继续留意,加油。