MySQL实现学生选课系统的成绩统计

一、实验目的
熟悉使用存储过程来进行数据库应用程序的设计。

二、实验内容与要求
对学生-课程数据库编写存储过程,完成以下一些功能:
1, 统计“离散数学”课程的成绩分布情况,即按照各分数段来统计人数。
2, 统计任意一门课程的平均成绩。
3, 将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。

三、实验完成情况(主要内容,操作步骤、算法描述或程序代码)
1、由于之前建立的学生选课数据库里并没有离散数学这门课,所以为了完成实验得在数据库的course表和sc表中添加关于离散数学的相关内容。
MySQL实现学生选课系统的成绩统计_第1张图片
MySQL实现学生选课系统的成绩统计_第2张图片

2、统计“离散数学”课程的成绩分布情况,即按照各分数段来统计人数。
(1)首先建立一个表存放执行后的结果。
这里写图片描述
(2)写存储过程
MySQL实现学生选课系统的成绩统计_第3张图片
具体的代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `countSoreP`()
BEGIN
    declare less60 smallint default 0; /*x <= 60*/
    declare b60a70 smallint default 0;
    declare b70a80 smallint default 0;
    declare b80a90 smallint default 0;
    declare more90 smallint default 0; 
    declare countcno char(4) default '****';

    SELECT cno
    INTO countcno FROM course
    WHERE cname = '离散数学';/*确定course表中有离散数学这门课*/

    SELECT COUNT(*)
    INTO less60 FROM sc
    WHERE cno = '8' AND grade < 60;
    SELECT COUNT(*)
    INTO b60a70 FROM sc
    WHERE cno = '8' AND grade >= 60 AND grade < 70;

    SELECT COUNT(*)
    INTO b70a80 FROM sc
    WHERE cno = '8' AND grade >= 70 AND grade < 80;

    SELECT COUNT(*)
    INTO b80a90 FROM sc
    WHERE cno = '8' AND grade >= 80 AND grade < 90;

    SELECT COUNT(*)INTO more90 FROM sc
    WHERE cno = '8' AND grade >= 90;
    create table countScore( scorestage char(10), number smallint);
    insert into countscore values('x<60', less60);
    insert into countscore values('60<=x<70', b60a70);
    insert into countscore values('70<=x<80', b70a80);
    insert into countscore values('80<=x<90', b80a90);
    insert into countscore values('x>=90', more90);
END

(3)、执行存储过程
MySQL实现学生选课系统的成绩统计_第4张图片
(4)、结果countscore表
MySQL实现学生选课系统的成绩统计_第5张图片
3、统计任意一门课的平均成绩
(1)、创建表结构,用来存储执行结果

MySQL实现学生选课系统的成绩统计_第6张图片
(2)、写存储过程
MySQL实现学生选课系统的成绩统计_第7张图片
具体代码:
CREATE DEFINER=root@localhost PROCEDURE scoreavgP()
BEGIN
declare curname char(40) default ‘*‘;
declare curcno char(4) default ‘**‘;
declare curavg char(4);
declare mycursor cursor for
select cno, cname from course;

open mycursor;

loop /当游标打开时进行下列循环处理/
fetch mycursor into curcno, curname; /游标推进一行取结果送变量/
select avg(grade) into curavg from sc
where cno = curcno;
insert into scoreavg values(curcno, curname, curavg);
end loop;
close mycursor;
END
(3)、执行存储过程
这里写图片描述
(4)、结果scoreavg表
MySQL实现学生选课系统的成绩统计_第8张图片
4、将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
(1)、写存储过程
MySQL实现学生选课系统的成绩统计_第9张图片
代码:

  CREATE PROCEDURE `changeStageP` ()
     BEGIN
    declare chgrade char(1) default 'A';
    declare grade smallint(6) default 0;
    declare ID int default 0;

    declare  mycursor2 cursor for
        select grade from sc;

    alter table sc add column(newgrade char(1));

    open mycursor2;
        loop /*当游标打开时进行下列循环处理*/
            fetch mycursor2 into grade; /*游标推进一行取结果送变量*/
            if grade < 60 then
                chgrade = 'E';
            elseif grade < 70 then
                chgrade = 'D';
            elseif grade < 80 then
                chgrade = 'C';
            elseif grade < 90 then
                chgrade = 'B';
            elseif
                chgrade = 'A';
            update id set id = id + 1 where id < 9
            update sc(id) set newgrade = chgrade;
        end loop;  
        close mycursor;
END
(2)、执行及结果

MySQL实现学生选课系统的成绩统计_第10张图片
四、出现的问题及解决办法
本次实验让我进一步熟悉了mysql的使用,并且学会了mysql存储过程建立方法。虽然在百度上都有源代码,但是真正自己做得时候会出现很多问题 ,得靠自己一个个修改,一点一点的去学。

你可能感兴趣的:(MYSQL)