数据库实验—存储过程
-
创建下列存储过程:
查询某位学生指定课程的成绩和学分(修正:若该学生的课程成绩小于60分,则学分要显示为0分)
提示:使用CASE…WHEN
例如:分别查询’张建国’和’李平方’选修的’数据库系统原理’课程的成绩和学分- is_credit是重命名的,可以随便取(符合语法即可)。
- 你也可以不重命名,直接裸用case when then语句
create procedure Stu_Proc_SelRepinfo @name nvarchar(4),@cname nvarchar(20) as select R.Grade, is_credit=(case when R.Grade < 60 or R.Grade is null then 0 else C.Ccredit end) from Students S inner join Reports R on S.Sno = R.Sno inner join Courses C on R.Cno = C.Cno where S.Sname = @name and C.Cname = @cname
- 执行下面的语句
exec Stu_Proc_SelRepInfo '张建国','数据库系统原理' exec Stu_Proc_SelRepInfo '李平方','数据库系统原理'
-
创建下列存储过程:
利用学生学号查询该名学生各学期的选修课程情况,要求显示学生的学号,姓名,选修的学年,学期,选修的课程号,课程名及其成绩,显示结果按学年和学期升序排列。
例如:查询学号为‘2016115101’的选课情况create procedure Stu_Proc_SelSno @sno varchar(20) as select S.Sno, S.Sname,R.Racademicyear, R.Rterm, C.Cno,C.Cname,R.Grade from Students S,Courses C,Reports R where S.Sno = R.Sno and R.Cno = C.Cno and S.Sno = @sno order by R.Racademicyear,R.Rterm
- 执行下面的语句
exec Stu_Proc_SelSno '2016115101'
-
创建下列存储过程:
统计指定入学年级指定学院名中,各省的生源人数,要求显示入学年级,学院名,生源地(只显示省份)及生源人数。(提示:LEFT函数)
例如:查询2016级计算机与信息工程学院的生源情况create procedure Stu_Proc_SelGraDname @year int, @dname varchar(20) as select left(S.Sno,4), D.Dname,left(S.Snative,2), count(S.Sno) from Students S, Department D where S.Dno = D.Dno and D.Dname = @dname and convert(int,left(S.Sno,4)) = @year group by left(S.Snative,2),left(S.Sno,4), D.Dname
- 执行下面的验证语句
exec Stu_Proc_SelGraDname 2016,'计算机与信息工程学院'
-
创建下列存储过程:
利用学生学号查询该名学生在指定学年,指定学期所获得的学分数以及还未获得的学分数,若该门课程尚无成绩或成绩小于60分,则为尚未获得的学分,结果以变量形式输出(OUTPUT)。(提示:ISNULL函数)
例如:分别查询学号为2014112103和2014112104的学生2014年第一学期的学分情况create procedure Stu_Proc_SelCredit @sno varchar(20),@year int,@term int, @GetCredits int output, @NotGetCredits int output as select @GetCredits=sum(C.Ccredit) from Reports R,Courses C where R.Cno = C.Cno and R.Sno = @sno and R.Racademicyear = @year and R.Rterm = @term and R.Grade > 60 and R.Grade is not null select @NotGetCredits=sum(C.Ccredit) from Reports R,Courses C where R.Cno = C.Cno and R.Sno = @sno and R.Racademicyear = @year and R.Rterm = @term and (R.Grade is null or R.Grade < 60)
- 执行下面的验证语句
- 解释:isnull是内置函数,isnull(表达式,表达式null时候返回的值),如果表达式不为null就返回表达式的值否则就返回第二个参数
下面的代码块都要全选中然后执行 declare @GetCredits int -- 声明 declare @NotGetCredits int -- 声明 exec Stu_Proc_SelCredit '2014112103',2014,1, @GetCredits output,@NotGetCredits output ----上面代表将结果输出到两个声明的变量中-- --------下面就是用select将其输出--------因为select可以使用重命名列名=值来输出 select 学号='2014112103', 已获学分=isnull(@GetCredits,0), 未获学分=isnull(@NotGetCredits,0)
下面的代码块都要全选中然后执行 declare @GetCredits int declare @NotGetCredits int exec Stu_Proc_SelCredit '2014112104',2014,1, @GetCredits output,@NotGetCredits output select 学号='2014112104', 已获学分=isnull(@GetCredits,0), 未获学分=isnull(@NotGetCredits,0)
- 执行下面的验证语句
-
创建下列存储过程:
统计指定班级指定课程的考试情况,要求显示出不同分值段(10分为一个分值段)的学生人数,
如(100 ~ 90,2人;89 ~ 80,7人;…)
提示:CASE (WHEN… THEN)
例如:查询20152101班计算机科学概论的考试情况create proc Stu_Proc_SelGrade @sclass varchar(20), @cname varchar(20) as select RG.Level_Grade '等级',count(RG.Level_Grade) '人数' from (select Level_Grade=(case when R.Grade > 90 then 'A' when R.Grade between 80 and 90 then 'B' when R.Grade between 70 and 80 then 'C' when R.Grade between 60 and 70 then 'D' when R.Grade < 60 then 'E' else '未考'end) from Reports R, Courses C, Students S where R.Cno = C.Cno and S.Sno = R.Sno and S.Sclass = @sclass and C.Cname = @cname group by (case when R.Grade > 90 then 'A' when R.Grade between 80 and 90 then 'B' when R.Grade between 70 and 80 then 'C' when R.Grade between 60 and 70 then 'D' when R.Grade < 60 then 'E' else '未考'end) ) as RG group by RG.Level_Grade
- 执行下面的验证语句
exec Stu_Proc_SelGrade '20152101','计算机科学概论'
-
创建下列存储过程:
统计各学院中指定职称的教师人数,默认给出“讲师”的人数
例如:统计“讲师”、“教授”的人数
将存储过程的执行结果截图,图中需标记学号最后两位create proc Tea_Proc_SelTeaNum @Tprof_Num int output, @Tprof varchar(20) = '讲师' as select T.Dno,T.Tprof,count(T.Tno) from Teachers T where T.Tprof = @Tprof group by T.Dno, T.Tprof
- 执行下面的验证语句
-- 默认查询每个学院讲师的人数 declare @Tnum int exec Tea_Proc_SelTeaNum @Tnum output if @Tnum IS NULL print 0 else print @Tnum
-- 查询每个学院教授的人数 declare @Tnum int exec Tea_Proc_SelTeaNum @Tnum output, '教授' if @Tnum IS NULL print 0 else print @Tnum
-
创建下列存储过程:
统计指定教师指定学年的教学工作量(教学工作量=所有教授的课程学时数的总和),教学工作量要求作为输出参数。
例如:查询教师刘伟2015学年的教学工作量create proc Tea_Proc_SelWork @tname varchar(20),@year int, @hours int output as select sum(C.Chours) from Tutors Tu, Courses C,Teachers T where Tu.Tno = T.Tno and T.Tname = @tname and C.Cno = Tu.Cno and Tu.Tacademicyear = @year
- 执行下面的验证语句
declare @hours int exec Tea_Proc_SelWork '刘伟',2015,@hours output select @hours '工作量'
-
创建下列存储过程:
统计指定教师每月需要缴纳的税金是多少,如果是中级以下职称(含中级),则税金=(工资+岗位津贴-1500)*5%;如果是副高级职称,则税金=(工资+岗位津贴-2000)*5%;如果是正高级职称,则税金=(工资+岗位津贴-2500)*5%
提示:IF… ELSE…
例如:查询王平、李力的税金情况create proc Tea_Proc_SelTax @tname varchar(20),@tax decimal(10,2) output as declare @tmp int declare @prof varchar(20) select @prof=T.Tprof from Teachers T where T.Tname = @tname if(@prof='教授') set @tmp=2500 else if(@prof='副教授') set @tmp=2000 else set @tmp=1500 select @tax=(Tsal+Tcomm-@tmp)*0.05 from Teachers where Tname=@tname
- 执行下面的验证语句
declare @tax decimal(10,2) exec Tea_Proc_SelTax '王平', @tax output print @tax exec Tea_Proc_SelTax '李力', @tax output print @tax
-
创建下列存储过程(选课情况综合查询):
可分别按:学号,学生姓名,课程编号,课程名称,班级编号,等查询学生的选课情况,查询结果显示(班级编号,学号,学生姓名,课程编号,课程名称,选修学年,选修学期,成绩)
提示:需要两个输入参数,一个参数用来指定查询的类别,另一个参数用来指定查询的具体信息,存储过程中需要根据查询类别不同,分别写出对应的查询语句create proc Rep_Proc_SelRep @type varchar(20),@infor varchar(20) as if (@type='学号') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where S.Sno = @infor and S.Sno = R.Sno and C.Cno = R.Cno return end if (@type='学生姓名') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where S.Sname = @infor and S.Sno = R.Sno and C.Cno = R.Cno return end if (@type='课程编号') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where R.Cno = @infor and S.Sno = R.Sno and C.Cno = R.Cno return end if (@type='课程名称') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where C.Cname = @infor and S.Sno = R.Sno and C.Cno = R.Cno return end if (@type='班级编号') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where S.Sclass = @infor and S.Sno = R.Sno and C.Cno = R.Cno return end if (@type='学号') begin return end if (@type='学年') begin select S.Sclass,S.Sname,C.Cno,C.Cname,R.Racademicyear,R.Rterm,R.Grade from Students S,Courses C,Reports R where R.Racademicyear = convert(int,@infor) and S.Sno = R.Sno and C.Cno = R.Cno return end
本文来自博客园,作者:竹等寒,转载请注明原文链接。