0
点赞
收藏
分享

微信扫一扫

数据库上机实验三(游标)

素锦时年_1b00 2022-03-30 阅读 55
后端sql

关于数据库实验一、二和数据库的创建请参考此处
什么叫游标?游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
游标可以类比于C语言文件中的指针,可以根据需要使得选择对应的行。
游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
这些都是固定的格式,对于游标使用还算是比较常规的。
声明游标:

declare st_cursor cursor 
for select colum from table where ...

打开游标:

open st_cursor

读取游标

fetch next from into @你的变量

关闭游标

close st_cursor

释放游标

deallocate st_cursor

本次实验内容是实验三+《数据库原理及应用》书P199 第12-14习

-- Test3-1
use Library2128
select
	出版社,cast(cast(cast(count(出版社) as decimal(4,1))/cast((select count(*)
from
	book2128) as decimal(4,1))*100 as decimal(4,1)) as varchar(5)) +'%'  百分比,
case
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.5 then '很高'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.3 then '较高'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.1 then '一般'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))<0.1 then '较低'
end 比例
from book2128
group by 出版社
order by cast(count(出版社) as decimal(4,1))/cast((select count(*)from book2128) as 	decimal(4,1))
-- Test3-2
select
	出版社,cast(cast(cast(count(出版社) as decimal(4,1))/cast((select count(*)
from
	book2128) as decimal(4,1))*100 as decimal(4,1)) as varchar(5)) +'%'  百分比,
case
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.5 then '很高'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.3 then '较高'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))>0.1 then '一般'
	when cast(count(出版社)as decimal(4,1)) /cast((select count(*)from book2128) as 	decimal(4,1))<0.1 then '较低'
end 比例
from book2128
group by 出版社
order by cast(count(出版社) as decimal(4,1))/cast((select count(*)from book2128) as 	decimal(4,1))
desc
-- Test3-3
declare @bno char(20),@percent char(20),@price int
declare st_cursor cursor
	for select distinct book2128.图书名,book2128.定价
	from book2128
print 'BOOK                      Evaluate'
print '---------------------------------'
open st_cursor
fetch next from st_cursor into @bno,@price
while @@FETCH_STATUS=0
begin
	set @percent= case
	when @price > 50 then 'A'
	when @price > 30 then 'B'
	when @price > 20 then 'C'
	when @price > 10 then 'D'
	else 'E'
	end
print @bno+'  '+@percent
fetch next from st_cursor into @bno,@price
end
close st_cursor
deallocate st_cursor
go
-- Test3-4
declare @pub char(20),@percent decimal(4,1)
declare st_cursor cursor
	for select distinct t1.出版社,cast(借阅数*总数 as decimal(4,1)) 借出率
	from
	(
		select count(*) 总数,bk.出版社
		from book2128 bk
		group by bk.出版社
	) t1,
	(
		select bk.出版社,count(bor.图书编号) 借阅数
		from
			borrow2128 bor,book2128 bk
		where bor.图书编号=bk.图书编号
		group by bk.出版社
	) t2
	where t1.出版社=t2.出版社
open st_cursor
fetch next from st_cursor into @pub,@percent
print '出版社                   借出率'
print '----------------------------'
while @@FETCH_STATUS=0
begin
	print @pub+'    '+(CAST(@percent As char(5)))+'%'
	fetch next from st_cursor into @pub,@percent
end
close st_cursor
deallocate st_cursor
go
-- P199-12
set nocount  on
declare  @sclass nvarchar(10),@savg float
declare st_cursor cursor
    for select c.课程名,avg(s.分数)
         from course2128 c,score2128 s
         where c.课程号=s.课程号
         group by (c.课程名)
open st_cursor
fetch  next from st_cursor  into @sclass,@savg
print 'class       Avg'
print '-------------'
while @@fetch_status=0
begin
    print  cast(@sclass as nvarchar(8))+'  '+
           cast(@savg as nvarchar(10))
    fetch next  from st_cursor into @sclass,@savg
end
close st_cursor
deallocate  st_cursor
go
-- P199-13
declare @fs int,@dj nvarchar(2),@sno int,@cno nvarchar(10)
declare st_cursor cursor
    for select 学号,课程号,分数
        from score2128
        where 分数 is not null
open st_cursor
fetch next from st_cursor into @sno,@cno,@fs
print 'NUM     CLASS     SCORE'
print '-----------------------'
while @@fetch_status=0
begin
    set @dj=case
        when @fs>=90 then 'A'
		when @fs>=80 then 'B'
		when @fs>=70 then 'C'
		when @fs>=60 then 'D'
		else 'E'
end
print cast(@sno as char(8))+' '+@cno+'    '+@dj
	fetch next from st_cursor into @sno,@cno,@fs
end
close st_cursor
deallocate st_cursor
go
--P199 -14
declare @sclass char(10),@savg float
declare st_cursor cursor
	for select st.班号,avg(sc.分数)
		from student2128 st,score2128 sc
		where st.学号=sc.学号
		group by st.班号
open st_cursor
fetch next from  st_cursor into @sclass,@savg
print 'Class      Score'
print '-----------------'
while @@fetch_status=0
begin
	print @sclass+cast(@savg as char(10))
	fetch next from st_cursor into @sclass,@savg
end
close st_cursor
deallocate st_cursor
go
举报

相关推荐

0 条评论