Create Procedure
编写存储过程 proc_avgage , 向客户端返回每个系的学生的平均年龄
create proc proc_avgage
as
select sdept,AVG(Sage) avg_age
from Student
group by Sdept
编写存储过程 proc_comp , 比较数据库和操作系统两门课程的平均分的高低,并输出: XXX课程的平均分高
数据库内没有这两门课,以计算机文化学课程与高等数学课程代替
create proc proc_comp
as
if((select AVG(grade) from TSC join Course on TSC.Cno=Course.Cno
where Cname='计算机文化学'
group by TSC.Cno)>(select AVG(grade) from TSC join Course on TSC.Cno=Course.Cno
where Cname='高等数学'
group by TSC.Cno))
print'计算机文化学课程的平均分高'
else
print'高等数学课程的平均分高'
创建存储过程 proc_student_info,用于检索你本人的学生数据
create proc proc_student_info
as
select *
from Student
where Sno='1508100201'
分别执行上面的存储过程
修改 proc_comp,分别将两门课程的课程号作为输入参数,比较这两门课的平均分的高低,输出:
– XXX 课程的平均分高
alter proc proc_comp
@cname1 nvarchar(20),@cname2 nvarchar(20)
as
if((select AVG(grade) from TSC join Course on TSC.Cno=Course.Cno
where Cname=@cname1
group by TSC.Cno)>(select AVG(grade) from TSC join Course on TSC.Cno=Course.Cno
where Cname=@cname2
group by TSC.Cno))
print @cname1+'课程的平均分高'
else
print @cname2+'课程的平均分高'
修改 proc_student_info ,使之可检索指定学号的学生数据,执行上面的存储过程,输入参数为你本人的学号
alter proc proc_student_info
@sno varchar(20)
as
select *
from Student
where Sno=@sno
创建存储过程 proc_student_avg,计算指定学生(学号)平均成绩,并将该平均成绩通过参数输出
– 执行该存储过程,输入参数为你本人的学号
create proc proc_student_avg
@sno varchar(20),@avg_grade float output
as
select @avg_grade=AVG(grade)
from TSC
where Sno=@sno
group by Sno
由于本人所有成绩为空,没有任何输出,故用其他同学代替
修改上面的存储过程,根据平均成绩填写评语,如果平均分>60,评语为“合格”,否则评语为“不合格”,将评语写入Student表的comment列当中
– 调用上述存储过程,为你自己的学号添加评语
– 提示:先对Student表添加“评语(comment)” 列
alter proc proc_student_avg
@sno varchar(20)
as
if((select AVG(grade)
from TSC
where Sno=@sno
group by Sno)>=60)
update Student
set comment='及格'
where Sno=@sno
else
update Student
set comment='不及格'
where Sno=@sno
列出每个系的学生信息
首先列出一个系的系名
然后在该系名下列出本系学生的姓名和性别
直至列出全部系
declare @sdept nchar(20)
declare @sdept1 nchar(20)
declare @name nchar(5)
declare @sex nchar(1)/*声明变量*/
declare cur_temp1 cursor
static for select sdept from student
where sdept<>'cs' group by sdept/*声明游标*/
declare cur_temp2 cursor
static for select sname,ssex,sdept from student
where sdept<>'cs' /*游标*/
open cur_temp1 --打开游标
FETCH NEXT FROM cur_temp1 INTO @sdept1 --取出游标值
while @@FETCH_STATUS=0
begin
print @sdept1
print '姓名 '+'性别'
open cur_temp2 --打开游标
FETCH NEXT FROM cur_temp2 INTO @name,@sex,@sdept --取出游标值
while @@FETCH_STATUS=0
begin
if(@sdept1=@sdept)
begin
print @name+' '+@sex
end
FETCH NEXT FROM cur_temp2 INTO @name,@sex,@sdept --循环取出游标的值
end
print' '
close cur_temp2 --关闭游标
FETCH NEXT FROM cur_temp1 INTO @sdept1 --循环取出游标的值
end
--关闭游标
close cur_temp1
--释放游标
deallocate cur_temp1
deallocate cur_temp2