SQL server游标的几种用法

游标的使用分为5步:
1、声明游标
2、打开游标
3、读取游标中的数据
4、关闭游标
5、释放游标

容易出错的地方:
1、while里面写begin、end
2、更新值的时候用set或select

1、计算没有选课的学生人数

涉及到的表:student、sc

--1、声明游标
declare num_cursor cursor
for
	select sno
	from student
for read only
--2、打开游标
open num_cursor
--声明变量
declare @sno char(20), @num int
select @num = 0
--3、读取游标中的数据
fetch next from num_cursor
into @sno
while @@FETCH_STATUS = 0
begin
	if not exists(select* from sc where Sno = @sno)
		select @num  = @num + 1
	fetch next from num_cursor
	into @sno
end
--打印未选课的学生人数
select @num
--4、关闭游标
close num_cursor
--5、释放游标
deallocate num_cursor

效果:
在这里插入图片描述

2、打印出每个科目的选课人数

涉及到的表:course、score

--1、声明游标
declare cno_cursor cursor
for 
	select cno
	from course
for read only
--2、打开游标
open cno_cursor
--声明变量
declare @cno char(20), @num int
select @num = 0
--3、读取游标中的数据
fetch next from cno_cursor
into @cno
while @@FETCH_STATUS = 0
begin
	select @num = COUNT(*) from Score where cno = @cno
	--打印当前科目的人数
	print convert(char(5), @cno) + ':' + convert(char(1), @num)
	fetch next from cno_cursor
	into @cno
end
--4、关闭游标
close cno_cursor
--5、释放游标
deallocate cno_cursor

效果:
在这里插入图片描述

3、根据学生成绩计算统计各个等级的人数

涉及到的表:sc

--声明游标
declare grade_cursor cursor
for
	select grade
	from sc
for read only
--打开游标
open grade_cursor

declare @grade int, @a int, @b int, @c int, @d int, @e int
select @a = 0, @b = 0, @c = 0, @d = 0, @e = 0

--读取游标中的数据
fetch next from grade_cursor
into @grade

while @@FETCH_STATUS = 0
begin
	if @grade is null or @grade < 60
		select @e = @e + 1
	else
		if @grade < 70
			select @d = @d + 1
		else
			if @grade < 80
				select @c = @c + 1
			else
				if @grade < 90
					select @b = @b + 1
				else
					select @a = @a + 1
	fetch next from grade_cursor
	into @grade
end

select @a, @b, @c, @d, @e

--关闭游标
close grade_cursor
--释放游标
deallocate grade_cursor

在这里插入图片描述

4、根据员工工资计算其个人所得税,3000元为起征点,超出3000元的部分按照10%的比例征收个人所得税

涉及到的表:salary_table

--声明游标
declare salary_cursor cursor
for
	select cno, salary
	from salary_table
for read only
--打开游标
open salary_cursor

declare @cno char(10), @salary int, @tax int

--读取游标中的数据
fetch next from salary_cursor
into @cno, @salary

while @@FETCH_STATUS = 0
begin
	if @salary <= 3000
		select @tax = 0
	else
		select @tax = (@salary - 3000) * 0.1
	update salary_table set tax = @tax where cno = @cno
	
	fetch next from salary_cursor
	into @cno, @salary
end

--关闭游标
close salary_cursor
--释放游标
deallocate salary_cursor

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/107157131