-
学生选课系统SqlSever数据库课程设计
2018-01-03 21:42:09Sqlsever2012以上的课程设计,只有数据库,设计了一个简单的选课系统,含有数据库、文档、学习资料等。使用到了存储过程和触发器、试图、游标等知识点。参考 -
数据库 高校学生选课管理系统
2018-01-25 17:50:43⑴功能需求 ①在学生个人信息模块,要求: a....⑦创建存储过程统计各学生指定学期选修课程的总学分数。 ⑧创建视图查询第一学年,没有被选修的课程。 ⑨创建存储过程统计各教师任课的学生人数。 -
php选课实验成品_数据库综合实验--设计某高校学生选课管理系统
2020-12-30 12:46:26数据库综合实验重做因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下题目如下:设计某高校学生选课管理系统实现学生信息、课程学生管理;...数据库综合实验重做
因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下
题目如下:
设计某高校学生选课管理系统
实现学生信息、课程学生管理;
实现教师及任课信息管理;
实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);
创建存储过程统计学生指定学期选修课程的总学分数;
创建视图查询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表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。
至此,数据库建立完毕。
结语
这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。
-
学生课程成绩信息实体表设计mysql_数据库综合实验--设计某高校学生选课管理系统...
2021-01-30 19:24:50数据库综合实验重做因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下题目如下:设计某高校学生选课管理系统实现学生信息、课程学生管理;...数据库综合实验重做
因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下
题目如下:
设计某高校学生选课管理系统
实现学生信息、课程学生管理;
实现教师及任课信息管理;
实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);
创建存储过程统计学生指定学期选修课程的总学分数;
创建视图查询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表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。
至此,数据库建立完毕。
结语
这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。
-
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
PROCEDUREscoreavgP
()
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-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
表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。
至此,数据库建立完毕。
结语
这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。
-
-
学生简单选课系统.rar
2020-08-21 10:01:28可供初学者了解数据的基本代码的编写,具有一些基本功能,且表名、函数的名和参数等全部是汉字,易于理解,内容包含数据库中数据表的创建、数据的插入、视图的创建、函数的创建、存储过程的创建和触发器的创建。 -
SQL Server数据库 + Java 某高校选课系统课程设计 原版java源码+数据库文件+注解
2013-07-14 23:49:04某高校学生选课管理系统 实现学生信息、课程学生管理; 实现教师及任课信息管理; 实现选课登记,要保证学 生不能选修重复的课程(实用触发器实现); 创建存储过程统计各学生指定学期选修课程 的总学分数; 创建... -
学生选课管理系统(SQL Server+Java 解决选课冲突问题+附源码)
2019-07-06 10:59:33(2) 实现学生选课、退课功能; (3) 实现教师及任课信息管理; (4) 实现教师开课、录入成绩功能 (5) 实现管理员创建和删除学生和教师用户; (6) 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现); (7)... -
使用PL/SQL编写存储过程访问数据库
2018-06-01 12:08:121实验目的 熟悉使用存储过程来进行数据库应用程序的设计。 2实验平台和实验工具 KingbaseES数据库管理系统,KingbaseES PL/SQL执行引擎。...将学生选课成绩从百分制改为等级制(即A、B、C、D、E); 要求... -
实验9 存储过程的创建和使用
2020-04-22 12:47:36阅读实验教材《SQL Server 2012数据库管理与开发》第137页到155页的内容,掌握存储过程的概念、了解存储过程的类别(系统存储过程,用户自定义存储过程,扩展存储过程);掌握存储过程的建立;掌握存储过程的两种... -
sql存储过程里substring()和charindex()的一点技巧用法
2011-02-27 21:32:00比如做一个学生选课系统 数据库有3张表 students(ID,Name,Age) ,courses(ID,Name),selectedcourses(studentID,courseID)括号里是字段。 下面是存储过程 根据传来的学生姓名以及选课构成的字符串,保存... -
求实现教务管理系统的数据库设计的的实验报告。。。
2015-03-18 02:06:43(5)设计存储过程,通过指定课程号或课程名,返回学生选课情况。 (6)设计存储过程,通过指定班级、学年和学期,统计该班男女学生的平均成绩。 7、设计触发器 (1)设计触发器,当插入新生时,实现班级人数的自动... -
数据库实验报告
2017-12-14 23:37:154.编写存储过程,以系别作为参数,统计指定系别的人数,并作为存储过程的输出。 实验题目: 数据库的完整性 实验目的: 掌握数据库的完整性约束定义,完整性检查及违约处理方式。 掌握触发器的定义及使用。 ... -
大学学生成绩管理系统(教务管理系统)
2011-03-19 23:39:34最近做的一个学生成绩管理系统(winform版),包括院系专业班级管理,权限管理,课程管理,选课管理,成绩管理(班级成绩和个人成绩管理)等,项目源文件有些大,我的上传权限只有15M,所以就先上传执行文件和dll了... -
数据库原理实验报告整合
2019-01-10 19:04:35默认情况下,SQL Server 将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库的存储路径。 完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成... -
数据库编程期末答疑,卷子讲解,SQL server相关操作讲解,如有侵权请联系删除
2020-06-27 00:50:215. 运行CreateTeaching.sql在系统数据库tempdb中生成解答用数据库对象,为计科系生成如下选修课综合信息视图(仅包括计科系学生的选课信息,未选课的计科系学生也包括在视图的数据集中,如果未选课则课程等相关字段... -
哈尔滨师范大学教务系统 v1.0.zip
2019-07-09 02:51:531、系统采用网页浏览的方式进行,采用人机对话的方式进行操作,界美观友好、信息查询灵活、方便、快捷、准确、数据存储快速安全可靠! 2、针对不同的用户,设计不同的功能和管理权限,对前台学生和老师可以进行快速... -
字节提前批测试测试开发面筋
2020-07-12 11:42:22问我项目里数据库存储是一对多还是多对多,然后说学生选课的系统应该几个表,写sql: student:id、name course:id、name sc:id、sid、cid 提供学生的名字,查询该学生选择的所有课程的名字 leftjoin和rightjoin... -
健康档案管理系统.RAR
2010-03-16 21:40:14(3) 设计一个实用的教学事务管理系统,处理教学的各种日常事务,如学生注册、选课、成绩登录,并可打印各种类型的通知单和报表。 (4) 图书馆要设计一个图书借阅系统,其功能包括: ① 借书:读者填写借书单,查询... -
asp.net,java,jsp,安卓Android,苹果ios,php,vb.net,c#免费毕业课程设计源码打包下载
2015-01-29 22:29:54| 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开发实战1200例(第I卷)》(李钟尉.陈丹丹).part2 高清完整PDF版
2016-06-13 15:53:27本书适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 1.1 Java环境 实例001 下载JDK开发工具包 ... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part3 高清完整PDF版
2016-06-13 16:11:24本书适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 1.1 Java环境 实例001 下载JDK开发工具包 ... -
Java Web开发实战1200例(第2卷)(完整版).(清华出版.卢瀚.王春斌).part1
2016-06-13 20:03:04实例143 获取数据库中所有存储过程 实例144 修改存储过程 实例145 删除存储过程 6.2 使用触发器 实例146 应用触发器添加日志信息 实例147 应用触发器级联删除数据 实例148 调用UPDATE触发器修改数据 实例149 获取... -
[大数据-互联网大规模数据挖掘与分布式处理]完整中文扫描版.part2.rar
2015-11-07 09:48:33麾下多名学生成为了数据库领域的专家,其中最有名的当属谷歌创始人Sergey Brin。 译者简介: 王斌,博士,中国科学院计算技术研究所博士生导师。中国科学院信息工程研究所客座研究员。主要研究方向为信息检索、自然... -
[大数据-互联网大规模数据挖掘与分布式处理]完整中文扫描版.part1.rar
2015-11-07 09:44:03麾下多名学生成为了数据库领域的专家,其中最有名的当属谷歌创始人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、数据结构、软件工程、数据库、操作系统、...