精华内容
下载资源
问答
  • Sqlsever2012以上的课程设计,只有数据库,设计了一个简单的选课系统,含有数据库、文档、学习资料等。使用到了存储过程和触发器、试图、游标等知识点。参考
  • ⑴功能需求 ①在学生个人信息模块,要求: a....⑦创建存储过程统计各学生指定学期选修课程的总学分数。 ⑧创建视图查询第一学年,没有被选修的课程。 ⑨创建存储过程统计各教师任课的学生人数。
  • 数据库综合实验重做因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下题目如下:设计某高校学生选课管理系统实现学生信息、课程学生管理;...

    数据库综合实验重做

    因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下

    题目如下:

    设计某高校学生选课管理系统

    实现学生信息、课程学生管理;

    实现教师及任课信息管理;

    实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);

    创建存储过程统计学生指定学期选修课程的总学分数;

    创建视图查询2006-2007学年,没有被选修的课程;

    创建存储过程统计各教师任课的学生人数;

    创建表间关系

    前言

    这部分说的是我之前的实现,和改进思路,节省时间可跳过。

    因为要求对于教师和课程等等的对应关系没有说明,所以可以自由发挥,我能找到 教师和课程之间是一对一关系的 实现,但是因为我想要实现教师课程多对多的数据库,所以就自己发挥了。

    当时做实验的时候,对数据的描述如下:

    一名学生可以选修多门课程,一门课程可被多个学生选修,每门课程对应一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授,每个老师所任教的每门课程有一个课程评价;一个老师可教多名学生。

    E-R图如下:

    用Excel做的表格如下:

    这个实现的问题就在于每个学生选的课程,是需要教师号和课程号一起才能共同确定的,这种情况实验要求就会很麻烦(而且E-R图上是三角多对多感觉很难受)改进思路就是将多一个临时班级实体,一个临时班级对应一个教师和一个课程,这样就可以将学生对老师和学生对课程这两个多对多关系化简成临时班级对老师,临时班级对课程这两个一对多的关系。

    接下来,正文开始。

    数据库描述和E-R图

    有要求,可转化成如下数据间关系:

    一名学生可以选修多门课程,一门课程可被多个学生选修,学生选修课程的实质是选临时班级。每个临时班级对应一门课程和一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授。

    E-R图如下:

    这里临时班级多了一个人数的属性主要是为了接下来统计人数方便。

    这里可以先按照E-R图在excel上把表建出来,输一些用于插入数据时做参考和验证。

    数据库建立

    需要建立的东西如下(加粗为主码):

    实体

    学生(学号,姓名,性别,生日,专业)

    教师(职工号,姓名,性别)

    课程(课程号,课程名,学分,开课学期)

    临时班级(班级号,课程号,教师号,人数)

    关系

    选课(学号,班级号,成绩)

    视图

    未选修06-07(班级号,课程名,教师名)

    Trigger

    学生不能选择课程号相同的课程。

    存储过程

    查看指定学期的学生学分

    各教师任课的学生人数

    下面是实现过程:

    建立选课模式

    CREATE SCHEMA select_courses;

    建立实体表

    -- student table

    CREATE TABLE students(

    stu_id INT PRIMARY KEY,

    name VARCHAR(40),

    birth_day DATE,

    sex VARCHAR(1),

    major VARCHAR(40)

    );

    -- teacher table

    CREATE TABLE teathers(

    tea_id INT PRIMARY KEY,

    name VARCHAR(40),

    sex VARCHAR(1)

    );

    -- courses table

    CREATE TABLE courses(

    course_id INT PRIMARY KEY,

    course_name VARCHAR(40),

    credit INT,

    open_time VARCHAR(20)

    );

    -- temp class table

    CREATE TABLE classes(

    class_id INT PRIMARY KEY,

    course_id INT,

    tea_id INT,

    number INT DEFAULT 0,

    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,

    FOREIGN KEY (tea_id) REFERENCES teathers(tea_id) ON DELETE CASCADE

    );

    建立多对多关系表

    CREATE TABLE select_courses(

    stu_id INT,

    class_id INT,

    grade INT,

    PRIMARY KEY (stu_id, class_id),

    FOREIGN KEY (stu_id) REFERENCES students(stu_id) ON DELETE CASCADE,

    FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE

    );

    插入除select_courses表以外的数据。

    这里要注意,在向classes表插入数据时,不要插入人数的数据。人数将会通过触发器,每当有人选课时(即向select_courses插入数据时),对应班级人数加一,删除同理。

    -- insert data into students

    INSERT INTO students VALUES(101, 'Guanyu', '1996-10-01', 'M', 'physical');

    INSERT INTO students VALUES(102, 'Zhangfei', '1997-01-03', 'M', 'physical');

    INSERT INTO students VALUES(103, 'Liubei', '1995-9-18', 'M', 'politics');

    INSERT INTO students VALUES(104, 'Sunquan', '1998-08-30', 'M', 'politics');

    INSERT INTO students VALUES(105, 'Xiaoqiao', '1999-4-21', 'F', 'art');

    -- insert data into teachers

    INSERT INTO teathers VALUES(201, 'Zhugeliang','M');

    INSERT INTO teathers VALUES(202, 'Zhouyu','M');

    INSERT INTO teathers VALUES(203, 'Huangzhong','M');

    INSERT INTO teathers VALUES(204, 'Caocao','M');

    INSERT INTO teathers VALUES(205, 'Daqiao','F');

    -- insert data into courses

    INSERT INTO courses VALUES(3001, 'history', 2, '2006-2007-1');

    INSERT INTO courses VALUES(3002, 'art of war', 3, '2006-2007-1');

    INSERT INTO courses VALUES(3003, 'archery', 3, '2006-2007-2');

    INSERT INTO courses VALUES(3004, 'stitchwork', 2, '2006-2007-2');

    INSERT INTO courses VALUES(3005, 'appreciate poetry', 3, '2007-2008-1');

    INSERT INTO courses VALUES(3006, 'language art', 2, '2007-2008-1');

    -- insert data into classes

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6001, 3001, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6002, 3001, 204);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6003, 3002, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6004, 3002, 202);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6005, 3003, 203);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6006, 3004, 205);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6007, 3005, 202);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6008, 3005, 204);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6009, 3006, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6010, 3006, 202);

    建立改变班级人数的辅助触发器

    因为用的是datagrip,所以就没有在头尾加delimiter。

    CREATE TRIGGER class_number_insert AFTER INSERT

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF NEW.class_id IN (SELECT class_id FROM classes) THEN

    UPDATE classes SET number = number + 1

    WHERE class_id = NEW.class_id;

    END IF;

    END;

    CREATE TRIGGER class_number_delete AFTER DELETE

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF OLD.class_id IN (SELECT class_id FROM classes) THEN

    UPDATE classes SET number = number - 1

    WHERE class_id = OLD.class_id;

    END IF;

    END;

    向select_courses表插入数据

    INSERT INTO select_courses VALUES(101,6001,90);

    INSERT INTO select_courses VALUES(101,6003,87);

    INSERT INTO select_courses VALUES(101,6008,80);

    INSERT INTO select_courses VALUES(102,6001,75);

    INSERT INTO select_courses VALUES(102,6002,60);

    INSERT INTO select_courses VALUES(103,6001,93);

    INSERT INTO select_courses VALUES(103,6010,85);

    INSERT INTO select_courses VALUES(103,6008,70);

    INSERT INTO select_courses VALUES(104,6004,87);

    INSERT INTO select_courses VALUES(104,6007,85);

    INSERT INTO select_courses VALUES(104,6010,80);

    INSERT INTO select_courses VALUES(105,6006,90);

    建立触发器,实现学生不能选择课程号相同的课程。

    若选择学生选择已选的课程,会抛出course was selected的异常。

    CREATE TRIGGER non_repetition BEFORE INSERT

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF (SELECT course_id

    FROM classes

    WHERE NEW.class_id = class_id)

    IN

    (SELECT classes.course_id

    FROM select_courses

    JOIN classes ON classes.class_id = select_courses.class_id

    WHERE stu_id = NEW.stu_id)

    THEN

    SIGNAL SQLSTATE 'HX000' SET MESSAGE_TEXT = 'course was selected';

    END IF;

    END;

    可以尝试插入一个错误数据,看看结果是否正确。

    6002班级的课程为3001,而101学生已选的6001班级也是教3001课程的,所以理论上这个数据不应该被插入。

    INSERT INTO select_courses VALUES(101,6002,90);

    创建视图,查询2006-2007学年没有被选修的课程

    这里“未选修”对应到表上就是,课程人数为0。2006-2007学年即2006-2007-1和2006-2007-2两个学期。

    CREATE VIEW not_selected_2006_2007

    AS

    SELECT class_id, course_name, name

    FROM classes

    JOIN courses c on classes.course_id = c.course_id

    JOIN teathers t on classes.tea_id = t.tea_id

    WHERE number = 0 AND open_time in ('2006-2007-1','2006-2007-2');

    创建存储过程,查看指定学期的学生学分

    CREATE

    PROCEDURE get_total_credit(IN term VARCHAR(20))

    BEGIN

    SELECT students.stu_id, students.name, SUM(courses.credit)

    FROM select_courses

    JOIN classes ON classes.class_id = select_courses.class_id

    JOIN students ON select_courses.stu_id = students.stu_id

    JOIN courses ON classes.course_id = courses.course_id

    WHERE courses.open_time = term

    GROUP BY students.stu_id, name;

    END;

    创建存储过程,各教师任课的学生人数

    CREATE PROCEDURE num_of_students()

    BEGIN

    SELECT t.name, c.course_name, SUM(number) num_of_stu

    FROM classes

    JOIN courses c on classes.course_id = c.course_id

    JOIN teathers t on classes.tea_id = t.tea_id

    GROUP BY c.course_id, t.tea_id;

    END;

    这里会发现,结果和classes表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。

    至此,数据库建立完毕。

    结语

    这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。

    展开全文
  • 数据库综合实验重做因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下题目如下:设计某高校学生选课管理系统实现学生信息、课程学生管理;...

    数据库综合实验重做

    因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下

    题目如下:

    设计某高校学生选课管理系统

    实现学生信息、课程学生管理;

    实现教师及任课信息管理;

    实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);

    创建存储过程统计学生指定学期选修课程的总学分数;

    创建视图查询2006-2007学年,没有被选修的课程;

    创建存储过程统计各教师任课的学生人数;

    创建表间关系

    前言

    这部分说的是我之前的实现,和改进思路,节省时间可跳过。

    因为要求对于教师和课程等等的对应关系没有说明,所以可以自由发挥,我能找到 教师和课程之间是一对一关系的 实现,但是因为我想要实现教师课程多对多的数据库,所以就自己发挥了。

    当时做实验的时候,对数据的描述如下:

    一名学生可以选修多门课程,一门课程可被多个学生选修,每门课程对应一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授,每个老师所任教的每门课程有一个课程评价;一个老师可教多名学生。

    E-R图如下:

    76c5326c8ddfddf73edbcfcfc82bfe11.png

    用Excel做的表格如下:

    aeb9b0e9207e4844f1b607083b55b915.png

    这个实现的问题就在于每个学生选的课程,是需要教师号和课程号一起才能共同确定的,这种情况实验要求就会很麻烦(而且E-R图上是三角多对多感觉很难受)改进思路就是将多一个临时班级实体,一个临时班级对应一个教师和一个课程,这样就可以将学生对老师和学生对课程这两个多对多关系化简成临时班级对老师,临时班级对课程这两个一对多的关系。

    接下来,正文开始。

    数据库描述和E-R图

    有要求,可转化成如下数据间关系:

    一名学生可以选修多门课程,一门课程可被多个学生选修,学生选修课程的实质是选临时班级。每个临时班级对应一门课程和一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授。

    E-R图如下:

    69673516cc75072181d1c04c5fbe52ef.png

    这里临时班级多了一个人数的属性主要是为了接下来统计人数方便。

    这里可以先按照E-R图在excel上把表建出来,输一些用于插入数据时做参考和验证。

    cc59cb58492a83b73d3ec9efac18433e.png

    数据库建立

    需要建立的东西如下(加粗为主码):

    实体

    学生(学号,姓名,性别,生日,专业)

    教师(职工号,姓名,性别)

    课程(课程号,课程名,学分,开课学期)

    临时班级(班级号,课程号,教师号,人数)

    关系

    选课(学号,班级号,成绩)

    视图

    未选修06-07(班级号,课程名,教师名)

    Trigger

    学生不能选择课程号相同的课程。

    存储过程

    查看指定学期的学生学分

    各教师任课的学生人数

    下面是实现过程:

    建立选课模式

    CREATE SCHEMA select_courses;

    建立实体表

    -- student table

    CREATE TABLE students(

    stu_id INT PRIMARY KEY,

    name VARCHAR(40),

    birth_day DATE,

    sex VARCHAR(1),

    major VARCHAR(40)

    );

    -- teacher table

    CREATE TABLE teathers(

    tea_id INT PRIMARY KEY,

    name VARCHAR(40),

    sex VARCHAR(1)

    );

    -- courses table

    CREATE TABLE courses(

    course_id INT PRIMARY KEY,

    course_name VARCHAR(40),

    credit INT,

    open_time VARCHAR(20)

    );

    -- temp class table

    CREATE TABLE classes(

    class_id INT PRIMARY KEY,

    course_id INT,

    tea_id INT,

    number INT DEFAULT 0,

    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,

    FOREIGN KEY (tea_id) REFERENCES teathers(tea_id) ON DELETE CASCADE

    );

    建立多对多关系表

    CREATE TABLE select_courses(

    stu_id INT,

    class_id INT,

    grade INT,

    PRIMARY KEY (stu_id, class_id),

    FOREIGN KEY (stu_id) REFERENCES students(stu_id) ON DELETE CASCADE,

    FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE

    );

    插入除select_courses表以外的数据。

    这里要注意,在向classes表插入数据时,不要插入人数的数据。人数将会通过触发器,每当有人选课时(即向select_courses插入数据时),对应班级人数加一,删除同理。

    -- insert data into students

    INSERT INTO students VALUES(101, 'Guanyu', '1996-10-01', 'M', 'physical');

    INSERT INTO students VALUES(102, 'Zhangfei', '1997-01-03', 'M', 'physical');

    INSERT INTO students VALUES(103, 'Liubei', '1995-9-18', 'M', 'politics');

    INSERT INTO students VALUES(104, 'Sunquan', '1998-08-30', 'M', 'politics');

    INSERT INTO students VALUES(105, 'Xiaoqiao', '1999-4-21', 'F', 'art');

    -- insert data into teachers

    INSERT INTO teathers VALUES(201, 'Zhugeliang','M');

    INSERT INTO teathers VALUES(202, 'Zhouyu','M');

    INSERT INTO teathers VALUES(203, 'Huangzhong','M');

    INSERT INTO teathers VALUES(204, 'Caocao','M');

    INSERT INTO teathers VALUES(205, 'Daqiao','F');

    -- insert data into courses

    INSERT INTO courses VALUES(3001, 'history', 2, '2006-2007-1');

    INSERT INTO courses VALUES(3002, 'art of war', 3, '2006-2007-1');

    INSERT INTO courses VALUES(3003, 'archery', 3, '2006-2007-2');

    INSERT INTO courses VALUES(3004, 'stitchwork', 2, '2006-2007-2');

    INSERT INTO courses VALUES(3005, 'appreciate poetry', 3, '2007-2008-1');

    INSERT INTO courses VALUES(3006, 'language art', 2, '2007-2008-1');

    -- insert data into classes

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6001, 3001, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6002, 3001, 204);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6003, 3002, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6004, 3002, 202);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6005, 3003, 203);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6006, 3004, 205);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6007, 3005, 202);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6008, 3005, 204);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6009, 3006, 201);

    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6010, 3006, 202);

    建立改变班级人数的辅助触发器

    因为用的是datagrip,所以就没有在头尾加delimiter。

    CREATE TRIGGER class_number_insert AFTER INSERT

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF NEW.class_id IN (SELECT class_id FROM classes) THEN

    UPDATE classes SET number = number + 1

    WHERE class_id = NEW.class_id;

    END IF;

    END;

    CREATE TRIGGER class_number_delete AFTER DELETE

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF OLD.class_id IN (SELECT class_id FROM classes) THEN

    UPDATE classes SET number = number - 1

    WHERE class_id = OLD.class_id;

    END IF;

    END;

    向select_courses表插入数据

    INSERT INTO select_courses VALUES(101,6001,90);

    INSERT INTO select_courses VALUES(101,6003,87);

    INSERT INTO select_courses VALUES(101,6008,80);

    INSERT INTO select_courses VALUES(102,6001,75);

    INSERT INTO select_courses VALUES(102,6002,60);

    INSERT INTO select_courses VALUES(103,6001,93);

    INSERT INTO select_courses VALUES(103,6010,85);

    INSERT INTO select_courses VALUES(103,6008,70);

    INSERT INTO select_courses VALUES(104,6004,87);

    INSERT INTO select_courses VALUES(104,6007,85);

    INSERT INTO select_courses VALUES(104,6010,80);

    INSERT INTO select_courses VALUES(105,6006,90);

    建立触发器,实现学生不能选择课程号相同的课程。

    若选择学生选择已选的课程,会抛出course was selected的异常。

    CREATE TRIGGER non_repetition BEFORE INSERT

    ON select_courses

    FOR EACH ROW

    BEGIN

    IF (SELECT course_id

    FROM classes

    WHERE NEW.class_id = class_id)

    IN

    (SELECT classes.course_id

    FROM select_courses

    JOIN classes ON classes.class_id = select_courses.class_id

    WHERE stu_id = NEW.stu_id)

    THEN

    SIGNAL SQLSTATE 'HX000' SET MESSAGE_TEXT = 'course was selected';

    END IF;

    END;

    可以尝试插入一个错误数据,看看结果是否正确。

    6002班级的课程为3001,而101学生已选的6001班级也是教3001课程的,所以理论上这个数据不应该被插入。

    INSERT INTO select_courses VALUES(101,6002,90);

    创建视图,查询2006-2007学年没有被选修的课程

    这里“未选修”对应到表上就是,课程人数为0。2006-2007学年即2006-2007-1和2006-2007-2两个学期。

    CREATE VIEW not_selected_2006_2007

    AS

    SELECT class_id, course_name, name

    FROM classes

    JOIN courses c on classes.course_id = c.course_id

    JOIN teathers t on classes.tea_id = t.tea_id

    WHERE number = 0 AND open_time in ('2006-2007-1','2006-2007-2');

    创建存储过程,查看指定学期的学生学分

    CREATE

    PROCEDURE get_total_credit(IN term VARCHAR(20))

    BEGIN

    SELECT students.stu_id, students.name, SUM(courses.credit)

    FROM select_courses

    JOIN classes ON classes.class_id = select_courses.class_id

    JOIN students ON select_courses.stu_id = students.stu_id

    JOIN courses ON classes.course_id = courses.course_id

    WHERE courses.open_time = term

    GROUP BY students.stu_id, name;

    END;

    创建存储过程,各教师任课的学生人数

    CREATE PROCEDURE num_of_students()

    BEGIN

    SELECT t.name, c.course_name, SUM(number) num_of_stu

    FROM classes

    JOIN courses c on classes.course_id = c.course_id

    JOIN teathers t on classes.tea_id = t.tea_id

    GROUP BY c.course_id, t.tea_id;

    END;

    这里会发现,结果和classes表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。

    至此,数据库建立完毕。

    结语

    这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。

    展开全文
  • MySQL实现学生选课系统的成绩统计

    万次阅读 2015-05-15 21:19:09
    一、实验目的 熟悉使用存储过程来进行数据库应用程序的设计。...3, 将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。三、实验完成情况(主要内容,操作步骤、算法描述或程序代码) 1、由于之前建立的学生选

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

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

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

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

    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)、执行存储过程
    这里写图片描述
    (4)、结果countscore表
    这里写图片描述
    3、统计任意一门课的平均成绩
    (1)、创建表结构,用来存储执行结果

    这里写图片描述
    (2)、写存储过程
    这里写图片描述
    具体代码:
    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表
    这里写图片描述
    4、将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
    (1)、写存储过程
    这里写图片描述
    代码:

      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的使用,并且学会了mysql存储过程建立方法。虽然在百度上都有源代码,但是真正自己做得时候会出现很多问题 ,得靠自己一个个修改,一点一点的去学。

    展开全文
  • 设计某高校学生选课管理系统

    千次阅读 2020-06-29 11:35:17
    设计某高校学生选课管理系统 因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下 题目如下: 设计某高校学生选课管理系统 实现学生信息、课程...

    设计某高校学生选课管理系统

    因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下

    题目如下:

    设计某高校学生选课管理系统

    • 实现学生信息、课程学生管理;

    • 实现教师及任课信息管理;

    • 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);

    • 创建存储过程统计学生指定学期选修课程的总学分数;

    • 创建视图查询2006-2007学年,没有被选修的课程;

    • 创建存储过程统计各教师任课的学生人数;

    • 创建表间关系

    前言

    这部分说的是我之前的实现,和改进思路,节省时间可跳过。

    因为要求对于教师和课程等等的对应关系没有说明,所以可以自由发挥,我能找到 教师和课程之间是一对一关系的 实现,但是因为我想要实现教师课程多对多的数据库,所以就自己发挥了。

    当时做实验的时候,对数据的描述如下:

    一名学生可以选修多门课程,一门课程可被多个学生选修,每门课程对应一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授,每个老师所任教的每门课程有一个课程评价;一个老师可教多名学生。

    E-R图如下:
    在这里插入图片描述

    用Excel做的表格如下:
    在这里插入图片描述

    这个实现的问题就在于每个学生选的课程,是需要教师号和课程号一起才能共同确定的,这种情况实验要求就会很麻烦(而且E-R图上是三角多对多感觉很难受)改进思路就是将多一个临时班级实体,一个临时班级对应一个教师和一个课程,这样就可以将学生对老师和学生对课程这两个多对多关系化简成临时班级对老师,临时班级对课程这两个一对多的关系。

    接下来,正文开始

    数据库描述和E-R图

    有要求,可转化成如下数据间关系:

    一名学生可以选修多门课程,一门课程可被多个学生选修,学生先修课程的实质是选临时班级。每个临时班级对应一门课程和一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授。

    依照此描述,E-R图如下:
    在这里插入图片描述

    这里临时班级多了一个人数的属性主要是为了接下来统计人数方便。

    这里可以先按照E-R图在excel上把表建出来,输一些用于插入数据时做参考和验证。
    在这里插入图片描述

    数据库建立

    需要建立的东西如下(加粗为主码):

    • 实体

      学生(学号,姓名,性别,生日,专业)

      教师(职工号,姓名,性别)

      课程(课程号,课程名,学分,开课学期)

      临时班级(班级号,课程号,教师号,人数)

    • 关系

      选课(学号班级号,成绩)

    • 视图

      未选修06-07(班级号,课程名,教师名)

    • Trigger

      学生不能选择课程号相同的课程。

    • 存储过程

      查看指定学期的学生学分

      各教师任课的学生人数

    下面是实现过程:

    • 建立选课模式

      CREATE SCHEMA select_courses;
      
    • 建立实体表

      -- student table
      CREATE TABLE students(
          stu_id INT PRIMARY KEY,
          name VARCHAR(40),
          birth_day DATE,
          sex VARCHAR(1),
          major VARCHAR(40)
      );
      
      -- teacher table
      CREATE TABLE teathers(
          tea_id INT PRIMARY KEY,
          name VARCHAR(40),
          sex VARCHAR(1)
      );
      
      -- courses table
      CREATE TABLE courses(
          course_id INT PRIMARY KEY,
          course_name VARCHAR(40),
          credit INT,
          open_time VARCHAR(20)
      );
      
      -- temp class table
      CREATE TABLE classes(
          class_id INT PRIMARY KEY,
          course_id INT,
          tea_id INT,
          number INT DEFAULT 0,
          FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,
          FOREIGN KEY (tea_id) REFERENCES teathers(tea_id) ON DELETE CASCADE
      );
      
    • 建立多对多关系表

      CREATE TABLE select_courses(
          stu_id INT,
          class_id INT,
          grade INT,
          PRIMARY KEY (stu_id, class_id),
          FOREIGN KEY (stu_id) REFERENCES students(stu_id) ON DELETE CASCADE,
          FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE
      );
      
    • 插入除select_courses表以外的数据

      -- insert data into students
      INSERT INTO students VALUES(101, 'Guanyu', '1996-10-01', 'M', 'physical'); 
      INSERT INTO students VALUES(102, 'Zhangfei', '1997-01-03', 'M', 'physical');
      INSERT INTO students VALUES(103, 'Liubei', '1995-9-18', 'M', 'politics');
      INSERT INTO students VALUES(104, 'Sunquan', '1998-08-30', 'M', 'politics');
      INSERT INTO students VALUES(105, 'Xiaoqiao', '1999-4-21', 'F', 'art');
      
      -- insert data into teachers
      INSERT INTO teathers VALUES(201, 'Zhugeliang','M');
      INSERT INTO teathers VALUES(202, 'Zhouyu','M');
      INSERT INTO teathers VALUES(203, 'Huangzhong','M');
      INSERT INTO teathers VALUES(204, 'Caocao','M');
      INSERT INTO teathers VALUES(205, 'Daqiao','F');
      
      -- insert data into courses
      INSERT INTO courses VALUES(3001, 'history', 2, '2006-2007-1');
      INSERT INTO courses VALUES(3002, 'art of war', 3, '2006-2007-1');
      INSERT INTO courses VALUES(3003, 'archery', 3, '2006-2007-2');
      INSERT INTO courses VALUES(3004, 'stitchwork', 2, '2006-2007-2');
      INSERT INTO courses VALUES(3005, 'appreciate poetry', 3, '2007-2008-1');
      INSERT INTO courses VALUES(3006, 'language art', 2, '2007-2008-1');
      
      -- insert data into classes
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6001, 3001, 201);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6002, 3001, 204);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6003, 3002, 201);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6004, 3002, 202);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6005, 3003, 203);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6006, 3004, 205);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6007, 3005, 202);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6008, 3005, 204);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6009, 3006, 201);
      INSERT INTO classes(class_id, course_id, tea_id) VALUES(6010, 3006, 202);
      

      这里要注意,在向classes表插入数据时,不要插入人数的数据。人数将会通过触发器,每当有人选课时(即向select_courses插入数据时),对应班级人数加一,删除同理。

    • 建立改变班级人数的辅助触发器

      CREATE TRIGGER class_number_insert AFTER INSERT
          ON select_courses
          FOR EACH ROW
          BEGIN
              IF NEW.class_id IN (SELECT class_id FROM classes) THEN
                  UPDATE classes SET number = number + 1 
                  WHERE class_id = NEW.class_id;
              END IF;
          END;
      
      CREATE TRIGGER class_number_delete AFTER DELETE
          ON select_courses
          FOR EACH ROW
          BEGIN
              IF OLD.class_id IN (SELECT class_id FROM classes) THEN
                  UPDATE classes SET number = number - 1 
                  WHERE class_id = OLD.class_id;
              END IF;
          END;
      

      因为用的是datagrip,所以就没有在头尾加delimiter

    • select_courses表插入数据

      INSERT INTO select_courses VALUES(101,6001,90);
      INSERT INTO select_courses VALUES(101,6003,87);
      INSERT INTO select_courses VALUES(101,6008,80);
      INSERT INTO select_courses VALUES(102,6001,75);
      INSERT INTO select_courses VALUES(102,6002,60);
      INSERT INTO select_courses VALUES(103,6001,93);
      INSERT INTO select_courses VALUES(103,6010,85);
      INSERT INTO select_courses VALUES(103,6008,70);
      INSERT INTO select_courses VALUES(104,6004,87);
      INSERT INTO select_courses VALUES(104,6007,85);
      INSERT INTO select_courses VALUES(104,6010,80);
      INSERT INTO select_courses VALUES(105,6006,90);
      
    • 建立触发器,实现学生不能选择课程号相同的课程。若选择学生选择已选的课程,会抛出course was selected的异常。

      CREATE TRIGGER non_repetition BEFORE INSERT
          ON select_courses
          FOR EACH ROW
          BEGIN
              IF (SELECT course_id 
                  FROM classes 
                  WHERE NEW.class_id = class_id)
                  IN 
                  (SELECT classes.course_id
                   FROM select_courses
                   JOIN classes ON classes.class_id = select_courses.class_id
                   WHERE stu_id = NEW.stu_id)
                  THEN
                  SIGNAL SQLSTATE 'HX000' SET MESSAGE_TEXT = 'course was selected';
              END IF;
          END;
      

      可以尝试插入一个错误数据,看看结果是否正确。

      INSERT INTO select_courses VALUES(101,6002,90);
      

      6002班级的课程为3001,而101学生已选的6001班级也是教3001课程的,所以理论上这个数据不应该被插入。

    • 创建视图,查询2006-2007学年没有被选修的课程

      CREATE VIEW not_selected_2006_2007
          AS 
          SELECT class_id, course_name, name
          FROM classes
          JOIN courses c on classes.course_id = c.course_id
          JOIN teathers t on classes.tea_id = t.tea_id
          WHERE number = 0 AND open_time in ('2006-2007-1','2006-2007-2');
      

      这里“未选修”对应到表上就是,课程人数为0。2006-2007学年即2006-2007-12006-2007-2两个学期。

    • 创建存储过程,查看指定学期的学生学分

      CREATE
          PROCEDURE get_total_credit(IN term VARCHAR(20))
          BEGIN
              SELECT students.stu_id, students.name, SUM(courses.credit)
              FROM select_courses
              JOIN classes ON classes.class_id = select_courses.class_id
              JOIN students ON select_courses.stu_id = students.stu_id
              JOIN courses ON classes.course_id = courses.course_id
              WHERE courses.open_time = term
              GROUP BY students.stu_id, name;
          END;
      
    • 创建存储过程,各教师任课的学生人数

      CREATE PROCEDURE num_of_students()
      BEGIN
          SELECT t.name, c.course_name,  SUM(number) num_of_stu
          FROM classes
          JOIN courses c on classes.course_id = c.course_id
          JOIN teathers t on classes.tea_id = t.tea_id
          GROUP BY c.course_id, t.tea_id;
      END;
      

      这里会发现,结果和classes表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。

    至此,数据库建立完毕。

    结语

    这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。

    展开全文
  • 学生简单选课系统.rar

    2020-08-21 10:01:28
    可供初学者了解数据的基本代码的编写,具有一些基本功能,且表名、函数的名和参数等全部是汉字,易于理解,内容包含数据库中数据表的创建、数据的插入、视图的创建、函数的创建、存储过程的创建和触发器的创建。
  • 某高校学生选课管理系统 实现学生信息、课程学生管理; 实现教师及任课信息管理; 实现选课登记,要保证学 生不能选修重复的课程(实用触发器实现); 创建存储过程统计各学生指定学期选修课程 的总学分数; 创建...
  • (2) 实现学生选课、退课功能; (3) 实现教师及任课信息管理; (4) 实现教师开课、录入成绩功能 (5) 实现管理员创建和删除学生和教师用户; (6) 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现); (7)...
  • 使用PL/SQL编写存储过程访问数据库

    千次阅读 2018-06-01 12:08:12
    1实验目的 熟悉使用存储过程来进行数据库应用程序的设计。 2实验平台和实验工具 KingbaseES数据库管理系统,KingbaseES PL/SQL执行引擎。...将学生选课成绩从百分制改为等级制(即A、B、C、D、E); 要求...
  • 阅读实验教材《SQL Server 2012数据库管理与开发》第137页到155页的内容,掌握存储过程的概念、了解存储过程的类别(系统存储过程,用户自定义存储过程,扩展存储过程);掌握存储过程的建立;掌握存储过程的两种...
  • 比如做一个学生选课系统 数据库有3张表 students(ID,Name,Age) ,courses(ID,Name),selectedcourses(studentID,courseID)括号里是字段。 下面是存储过程 根据传来的学生姓名以及选课构成的字符串,保存...
  • (5)设计存储过程,通过指定课程号或课程名,返回学生选课情况。 (6)设计存储过程,通过指定班级、学年和学期,统计该班男女学生的平均成绩。 7、设计触发器 (1)设计触发器,当插入新生时,实现班级人数的自动...
  • 数据库实验报告

    2017-12-14 23:37:15
    4.编写存储过程,以系别作为参数,统计指定系别的人数,并作为存储过程的输出。 实验题目: 数据库的完整性 实验目的: 掌握数据库的完整性约束定义,完整性检查及违约处理方式。 掌握触发器的定义及使用。 ...
  • 最近做的一个学生成绩管理系统(winform版),包括院系专业班级管理,权限管理,课程管理,选课管理,成绩管理(班级成绩和个人成绩管理)等,项目源文件有些大,我的上传权限只有15M,所以就先上传执行文件和dll了...
  • 默认情况下,SQL Server 将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库存储路径。 完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成...
  • 5. 运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,为计科系生成如下选修课综合信息视图(仅包括计科系学生选课信息,未选课的计科系学生也包括在视图的数据集中,如果未选课则课程等相关字段...
  • 1、系统采用网页浏览的方式进行,采用人机对话的方式进行操作,界美观友好、信息查询灵活、方便、快捷、准确、数据存储快速安全可靠! 2、针对不同的用户,设计不同的功能和管理权限,对前台学生和老师可以进行快速...
  • 问我项目里数据库存储是一对多还是多对多,然后说学生选课系统应该几个表,写sql: student:id、name course:id、name sc:id、sid、cid 提供学生的名字,查询该学生选择的所有课程的名字 leftjoin和rightjoin...
  • 健康档案管理系统.RAR

    热门讨论 2010-03-16 21:40:14
    (3) 设计一个实用的教学事务管理系统,处理教学的各种日常事务,如学生注册、选课、成绩登录,并可打印各种类型的通知单和报表。 (4) 图书馆要设计一个图书借阅系统,其功能包括: ① 借书:读者填写借书单,查询...
  • | vb.net课程设计学生选课系统.rar 3.77 MB | VB1001房屋销售管理系统.rar 2.71 MB | VB学生公寓宿舍管理系统(SQL).rar 6.04 MB | vf教职工信息管理系统毕业设计.rar 2.30 MB | 安卓Android通讯录管理系统.rar 2.45 ...
  • 本书适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 1.1 Java环境 实例001 下载JDK开发工具包 ...
  • 本书适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 1.1 Java环境 实例001 下载JDK开发工具包 ...
  • 实例143 获取数据库中所有存储过程 实例144 修改存储过程 实例145 删除存储过程 6.2 使用触发器 实例146 应用触发器添加日志信息 实例147 应用触发器级联删除数据 实例148 调用UPDATE触发器修改数据 实例149 获取...
  • 麾下多名学生成为了数据库领域的专家,其中最有名的当属谷歌创始人Sergey Brin。 译者简介: 王斌,博士,中国科学院计算技术研究所博士生导师。中国科学院信息工程研究所客座研究员。主要研究方向为信息检索、自然...
  • 麾下多名学生成为了数据库领域的专家,其中最有名的当属谷歌创始人Sergey Brin。 译者简介: 王斌,博士,中国科学院计算技术研究所博士生导师。中国科学院信息工程研究所客座研究员。主要研究方向为信息检索、自然...
  • SQL sever 实训

    2018-06-28 21:10:03
    --创建存储过程P_Sale3,能够根据指定的产品编号和日期,以输出参数的形式得到该产品的销售金额 CREATE PROCEDURE P_Sale3 @ProNo nvarchar(5),@SaleDate DateTime,@MONEY Decimal(8,2)OUTPUT AS SET @MONEY=( ...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    本书主要内容包括:面试流程及准备、英语面试、电话面试、C/C++语言基础、流程控制、输入/输出、预处理、内存管理、指针、面向对象基础、类、多态、继承、函数、模板与STL、数据结构、软件工程、数据库、操作系统、...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

学生选课系统数据库存储过程