数据库实验—存储过程

在这里插入图片描述


  • 创建下列存储过程:
    查询某位学生指定课程的成绩和学分(修正:若该学生的课程成绩小于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
    
posted @ 2023-06-29 00:06  竹等寒  阅读(45)  评论(0编辑  收藏  举报  来源