触发器与视图练习

--班级表
create table Class
(
class_id int primary key identity,
class_name varchar(50) ,--班级名称
class_count int --班级数量
)
insert into Class VALUES('08A',1),('08B',1),('08C',1)
--学生表
create table student
(
stu_id int primary key identity,
stu_name varchar(50),--学生姓名
class_id int foreign key references Class(Class_id),--班级ID
AvgScore float --平均成绩
)
INSERT INTO STUDENT VALUES('杨洋',1,90),('郑爽',1,95),('周迅',1,98)
--分数表
create table Score
(
Score_Id int primary key identity,
Stu_Id int foreign key references Student(Stu_Id),--学生的外键
courseName varchar(50), --科目名称
score float  --学生成绩
)
insert into score values(1,'数据库',100),(2,'c#基础',96),(3,'java开发师',98)

--1.在SqlServer数据库中创建三个表:学生表、班级表、课程表的结构: 10分
--2.为学生表创建触发器:实现当添加一条学生信息时班级表中的学生数量加1 (10分)

--添加
go
create trigger V_stu
on student
for insert
as 
begin 
    update Class set class_count=class_count+1 where class_id=(select class_id from inserted)
end 
insert into student values('刘德华',1,0)
select * from class
--3.为学生表创建触发器:实现当修改学生表class_id时,print 出如下信息:‘警告:xx同学已经转到xx班级,请知晓!’  (10分)

go
create trigger V_st
on student
after update
as 
    declare @StuName nvarchar(50)
    declare @ClassName nvarchar(50)
begin
    select @StuName = stu_Name from inserted
    select @ClassName = class_Name from dbo.Class where class_id in (select class_id from inserted)
    print '警告:'+@StuName+'同学已经转到'+@ClassName+'班级,请知晓!'
end 
--删除
go
create trigger V_de
on student
for delete
as
begin
    update Class set class_count=class_count-1 where class_id =(select class_id from deleted)
end
delete from student where stu_id=1

--4.写一个标值函数 fun_GetSoreRank:  (总分20分)
--1).定义 Score输入参数, 返回 varchar(50)类型    (10) 
--2)在函数中使用 case  when then end  实现:根据传入的分数值进行等级判断,并返回相应的等级字符串,等级规则如下:   (10)
--                      成绩小于60分:不及格;60-70:及格;70-80:中等;80-100:优秀; 100:满分

go
create function fun_GetSoreRank(@Score varchar(50))
returns varchar(50)
as
begin 
    return 
    case
    when @score<60 then '不及格'
    when @score<70  and @score>60 then '及格'
    when @score>70 and @score<80 then '中等'
    when @score>80 and @score<100 then '满分'
    end
end
go
select  dbo.fun_GetSoreRank(96)

--5.编写一个视图v_getSutdentScore,查询出 学生名称、班级名称、考试科目、成绩分数、成绩等级(调用fun_GetSoreRank函数)   (10分)

go
create view v_getSutdentScore
as

select *,dbo.fun_GetSoreRank(s.score) '等级'  from  Score s join Student  t on
 s.Stu_Id = t.stu_id join class c on 
 t.class_id=c.class_id 

--6.编写一个存储过程 p_UpdateSutdentAvgSocre,实现批量统计某班级下每个学生的平均成绩并修改学生表中每个学生的平均分(AvgScore):   (40分)
--1)正确的创建存储过程,并定义输入参数classID   (5分)
--2)正确的定义、打开、关闭游标 (10)
--3)正确的使用while 进行循环逐行读取 (10)
--4)正确的判断游标的读取状态  (5分)
--实现使用游标逐行统计该班每个学生的平均成绩,并修改学生表的AvgScore字段  (10分)

go
create proc p_UpdateSutdentAvgSocre
(
 @classID int --传入的参数
)
as
begin        
    declare V_su cursor scroll -- ?
    for
    select stu_id,avgscore from dbo.student  --定义游标数据集
    open V_su  --打开游标
    declare @stu_id int
    declare @avgscore int
    fetch next from V_su into @stu_id,@avgscore
    declare @avg float
    --循环第一条记录
    while(@@FETCH_STATUS = 0)
    begin
            select avg(Score) from dbo.Score
            update dbo.student set AvgScore=@avg where stu_id = @stu_id
            fetch next from  V_su into @stu_id,@avgscore --接着循环
    end
    close V_su  --关闭游标
    deallocate V_su --释放游标
end

猜你喜欢

转载自blog.csdn.net/ProteaCynaroides/article/details/88405126