SQL Server学习笔记——游标

Posted Aiden_Zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server学习笔记——游标相关的知识,希望对你有一定的参考价值。

SQL Server学习笔记——游标

1. 游标基本介绍

定义:用来操作查询结果集,是一个用户数据缓冲区。

优点:保存查询结果,以便以后使用。游标的结果集是的select执行结果,需要的时候,只需要一次,不用重复查询。

缺点:数据缓冲区,如果游标数据量大则会造成内存不足。所以,在数据量小时才使用游标。

语法

游标名 cursor for select ...

步骤

  • 声明游标
  • 打开游标
  • 取数据(循环)
  • 关闭游标 或者 deallocate

举个栗子
查询major表中的mname数据,major表里面的数据有:

--声明游标
declare my_cursor cursor for select mname from major
declare @mname varchar(30) -声明变量,用于存储取出来的数据

--打开游标
open my_cursor

--取数据(循环)
fetch next from my_cursor into @mname
while @@FETCH_STATUS=0 --循环结束条件
begin
	select @mname as 'mname'
	fetch next from my_cursor into @mname
end

--关闭游标 或者 deallocate
deallocate my_cursor

查询结果为:

2. 举个例子

要求:对sc表添加一个等级列,若学生成绩80及以上,设为等级A,70-79分为B,其余为C,null仍为null。
首先在sc表中新建一个名为sc_rank的列:

插入sc_rank之后的sc表:

SQL语句如下:

--声明游标
declare my_cursor cursor for select sno, cno, grade from sc
declare @sno varchar(30)
declare @cno varchar(30)
declare @grade decimal

--打开游标
open my_cursor

--取数据(循环)
fetch next from my_cursor into @sno, @cno, @grade
while @@FETCH_STATUS=0
begin
	if @grade >= 80
		update sc set sc_rank = 'A' where cno = @cno and sno = @sno
	else if @grade >= 70
		update sc set sc_rank = 'B' where cno = @cno and sno = @sno
	else if @grade >= 0 --不能直接使用else,因为grade为null时,sc_rank也设为null
		update sc set sc_rank = 'C' where cno = @cno and sno = @sno

	fetch next from my_cursor into @sno, @cno, @grade
end

--关闭游标 或者 deallocate
deallocate my_cursor

执行之后的结果:

3. 与视图的比较

  1. 本质不同
    游标是作为指针操作,视图是作为数据库对象;
  2. 占用资源
    游标多,视图少;
  3. 工作方式
    游标:行处理,视图:一整个表(查询结果)

以上是关于SQL Server学习笔记——游标的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server学习笔记——游标

sql server 的游标

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

SQL Server讲课笔记02:查询与统计数据

SQL Server基础操作(此随笔仅作为本人学习进度记录九!--游标)

sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程