MySQL实训项目——学生成绩录入与分析系统

 项目简述:在校园中,除了上课之外,我们会有许多大大小小的考试,本项目将实现对学生数据的增添,删除,查询与修改,能让教育者更好的了解学生情况,进而优化教学方法和管理策略。

1.建表操作(DDL)

 
-- 创建学生信息表
CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID',
    name VARCHAR(50) NOT NULL COMMENT '学生姓名',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    class VARCHAR(50) NOT NULL COMMENT '班级',
    registration_date DATE COMMENT '注册日期'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
 
 
-- 创建科目表
CREATE TABLE subjects (
    subject_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '科目ID',
    subject_name VARCHAR(100) NOT NULL UNIQUE COMMENT '科目名称',
    teacher_name VARCHAR(100) COMMENT '教师姓名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='科目信息表';
 
 
-- 创建成绩表
CREATE TABLE scores (
    score_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '成绩ID',
    student_id INT NOT NULL COMMENT '学生ID',
    subject_id INT NOT NULL COMMENT '科目ID',
    score DECIMAL(5, 2) NOT NULL COMMENT '成绩',
    exam_date DATE COMMENT '考试日期',
    FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成绩表';
 
 
-- 创建成绩分析表(可选,用于存储分析结果)
CREATE TABLE score_analysis (
    analysis_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '分析ID',
    subject_id INT NOT NULL COMMENT '科目ID',
    avg_score DECIMAL(5, 2) NOT NULL COMMENT '平均分',
    max_score DECIMAL(5, 2) NOT NULL COMMENT '最高分',
    min_score DECIMAL(5, 2) NOT NULL COMMENT '最低分',
    analysis_date DATE COMMENT '分析日期',
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成绩分析表';
 
 
-- 创建系统配置表(可选,用于存储系统相关配置信息)
CREATE TABLE system_config (
    config_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID',
    config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键',
    config_value VARCHAR(255) COMMENT '配置值',
    description TEXT COMMENT '配置描述'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';

 2.插入表格数据(DML)

INSERT INTO students (name, gender, class, registration_date) VALUES
('张三', '男', '一班', '2023-09-01'),
('李四', '女', '二班', '2023-09-02'),
('王五', '男', '三班', '2023-09-03'),
('赵六', '女', '四班', '2023-09-04'),
('孙七', '男', '五班', '2023-09-05');
INSERT INTO subjects (subject_name, teacher_name) VALUES
('数学', '张老师'),
('英语', '李老师'),
('物理', '王老师'),
('化学', '赵老师'),
('生物', '孙老师');
INSERT INTO scores (student_id, subject_id, score, exam_date) VALUES
(1, 1, 85.50, '2023-10-15'), -- 张三的数学成绩
(1, 2, 90.25, '2023-10-15'), -- 张三的英语成绩
(2, 1, 78.75, '2023-10-15'), -- 李四的数学成绩
(2, 2, 88.00, '2023-10-15'), -- 李四的英语成绩
(5, 5, 92.00, '2023-10-15'); -- 孙七的生物成绩
INSERT INTO score_analysis (subject_id, avg_score, max_score, min_score, analysis_date) VALUES
(1, 82.38, 90.50, 75.00, '2023-10-17'), -- 数学成绩分析
(2, 86.75, 92.00, 80.00, '2023-10-17'), -- 英语成绩分析
(5, 89.25, 95.00, 85.00, '2023-10-17'); -- 生物成绩分析
INSERT INTO system_config (config_key, config_value, description) VALUES
('school_name', '阳光中学', '学校名称'),
('admin_email', 'admin@example.com', '管理员电子邮箱'),
('exam_schedule_url', 'https://example.com/exam-schedule', '考试安排网址');

效果图 

 各表格内数据:

 

 

 

 

对上面表单做出相应的E-R图:

3.对学生信息的基础增删查改语句:

 -- 学生信息管理:管理学生的基本信息,如姓名、性别、班级等。
select name,gender,class from students;
-- 成绩录入:支持教师录入学生的各科成绩。

-- 插入学生成绩
INSERT INTO scores (student_id, subject_id, score, exam_date)
VALUES (3, 3, 80.00, '2023-10-16'); -- 假设王五的物理成绩

-- 成绩查询与修改:提供学生、教师或管理员查询学生成绩的功能,并允许对成绩进行必要的修改。

-- 查询学生成绩
SELECT s.name AS 学生姓名, sb.subject_name AS 科目名称, sc.score AS 成绩, sc.exam_date AS 考试日期
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
JOIN subjects sb ON sc.subject_id = sb.subject_id
WHERE s.name = '张三'; -- 假设查询张三的成绩

-- 修改学生成绩
UPDATE scores
SET score = 95.00
WHERE student_id = 1 AND subject_id = 1; -- 假设修改张三的数学成绩为95.00

 效果图:

 4.触发器

DELIMITER //
CREATE TRIGGER update_score_analysis_after_insert_or_update
AFTER INSERT ON scores
FOR EACH ROW
BEGIN
    DECLARE subject_id_var INT;
    DECLARE avg_score_var DECIMAL(5, 2);
    DECLARE max_score_var DECIMAL(5, 2);
    DECLARE min_score_var DECIMAL(5, 2);

    SET subject_id_var = NEW.subject_id;

    -- 计算平均分、最高分、最低分
    SELECT AVG(score), MAX(score), MIN(score)
    INTO avg_score_var, max_score_var, min_score_var
    FROM scores
    WHERE subject_id = subject_id_var;

    -- 更新score_analysis表
    UPDATE score_analysis
    SET avg_score = avg_score_var,
        max_score = max_score_var,
        min_score = min_score_var,
        analysis_date = NOW()
    WHERE subject_id = subject_id_var;

    -- 如果不存在则插入
    IF ROW_COUNT() = 0 THEN
        INSERT INTO score_analysis (subject_id, avg_score, max_score, min_score, analysis_date)
        VALUES (subject_id_var, avg_score_var, max_score_var, min_score_var, NOW());
    END IF;
END;
//
DELIMITER ;


-- 同样,为了完整性,也可以为UPDATE操作创建触发器
DELIMITER //
CREATE TRIGGER update_score_analysis_after_update
AFTER UPDATE ON scores
FOR EACH ROW
BEGIN
    -- 这里可以复制上面的触发器逻辑,或者只更新发生变化的科目分析
    -- ...(与上面的逻辑类似,但只针对被更新的科目)
END;
//
DELIMITER ;

-- 成绩分析:基于录入的成绩数据,进行统计分析,如平均分、最高分、最低分、成绩分布等。

-- 报表生成:自动生成成绩报表,方便打印或导出。

-- 生成所有科目的成绩报表
SELECT s.name AS 学生姓名, sb.subject_name AS 科目名称, sc.score AS 成绩, sc.exam_date AS 考试日期
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
JOIN subjects sb ON sc.subject_id = sb.subject_id
ORDER BY s.name, sb.subject_name;

 效果图:

5.存储过程 

CALL UpdateStudentScore(1, 1, 95.00); --调用

DELIMITER // --插入时的存储过程
CREATE PROCEDURE InsertStudentScore(IN p_student_id INT, IN p_subject_id INT, IN p_score DECIMAL(5,2), IN p_exam_date DATE)
BEGIN
    INSERT INTO scores (student_id, subject_id, score, exam_date)
    VALUES (p_student_id, p_subject_id, p_score, p_exam_date);
END;
//
DELIMITER ;
CALL UpdateStudentScore(1, 1, 95.00);
DELIMITER // --查询时的存储过程
CREATE PROCEDURE QueryStudentScore(IN p_student_name VARCHAR(255))
BEGIN
    SELECT s.name AS 学生姓名, sb.subject_name AS 科目名称, sc.score AS 成绩, sc.exam_date AS 考试日期
    FROM students s
    JOIN scores sc ON s.student_id = sc.student_id
    JOIN subjects sb ON sc.subject_id = sb.subject_id
    WHERE s.name = p_student_name;
END;
//
DELIMITER ;

DELIMITER // --修改时的存储过程
CREATE PROCEDURE UpdateStudentScore(IN p_student_id INT, IN p_subject_id INT, IN p_new_score DECIMAL(5,2))
BEGIN
    UPDATE scores
    SET score = p_new_score
    WHERE student_id = p_student_id AND subject_id = p_subject_id;
END;
//
DELIMITER ;

效果图:

 

6.项目总结

本项目能够基础实现对学生信息的增删查改,并对信息进行存储。在代码设计的时候,中途会遇到一些运行失败和报错的情况,但在不断的修改中最终使SQL语句能够成功达到预期的效果。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生成绩管理系统 1 问题描述 1.1 背景 1)某大学有学生若干万名,每个学生每学期必须学习若干门课程。 2)每个学生有学号、姓名、性别、班级、出生日期等基本信息。 3)每门课程有课程号,课程名称、任课教师、学分等信息。 4)学校需要对每个学生的基本信息、所学课程、成绩进行统一管理,以便于对信息进行 查询、浏览和修改。 1.2 数据需求 学生成绩管理系统主要用于学生成绩信息管理,据分析学生成绩管理系统的数据表可浓 缩为:学生基本信息表、课程基本信息表和学生成绩信息表。根据学校的情况,可按下 面的步骤来分析: 1) 确定学生所在的院系、所学的专业以及所在的班级。 2) 确定学生所在班级的课程以及该课程学生的成绩;另外还需要知道学生所在班级、学 号和学期。 3) 分析学生的基本信息,如姓名、性别、出生年月、家庭住址、联系电话。 4) 用户信息分析,通常包括用户名和密码。 2 解决方案 ( 或数据库系统设计 ) 2.1 E-R 模型设计 根据E—R图,将其转化为如下数据实体,数据库学生成绩管理系统.dbc,包括如下的表 和视图: 1) 学生登记表——学生表.dbf。 字段名称 字段类型 字段宽度 xh 字符型 10 xm 字符型 6 xb 字符型 2 csrq 日期型 8 bj 字符型 4 2) 课程登记表——课程表.dbf。 字段名称 字段类型 字段宽度 kch 字符型 2 kcm 字符型 10 js 字符型 10 xf 字符型 10 3) 成绩登记表——成绩表.dbf 字段名称 字段类型 字段宽度 xh 字符型 10 kch 字符型 2 cj 数值型 3 4) 借书视图(lyxview)。 为了进行浏览总表的需要,需要设计了一个总表浏览视图,该视图从学生表.dbf等 3个表中提取了10个字段的数据: 学生表.xh 学生表.xm 学生表.xb 学生表.csrq 学生表.bj 课程表.kch 课程表.kcm 课程表.js 课程表.xf 成绩表.cj 其视图关系可由以下SQL语句定义: SELECT 学生表.*, 课程表.*, 成绩表.cj; FROM 学生成绩管理系统!学生表, 学生成绩管理系统!课程表,; 学生成绩管理系统!成绩表; WHERE 学生表.xh = 成绩表.xh; AND 课程表.kch = 成绩表.kch 所建数据库如下图所示: 2.2 数据表 本系统需要使用的数据如下: 3 系统实现 3.1 开发环境 本系统由SQL语言编写,在Visual Foxpro 6.0软件环境下可以正常运行 3.2 系统流程图 系统流程图模块主要由刘龙洋同学设计,而系统的功能设计主要由李江滨同学完成, 我主要负责程序主要功能界面的设计,下面是部分流程图: 、 3.3 程序主要功能界面 1、登录界面的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"登录"; 第三步:添加lable1,并设置其caption属性为"欢迎使用学生成绩管理系统!"; 第四步:添加lable2和text1并设置相关属性; 第五步:添加timer控件,并设置其Enabled属性为"真",用于设计窗口动画。 登录界面如下图所示: 2、修改密码表单的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"修改密码"; 第三步:添加label1 、label2、 label3,并设置其caption属性分别为"请输入旧密码"、"请输入新密码"、"请确认新密 码"; 第四步:添加text1、 text2、 text3,并设置相关属性; 第五步:添加command1和command2,并设置其caption属性分别为"确认"和"取消"; 修改密码表单如下图: 3、学生基本信息维护表单的设计: 第一步:创建表单,并保存为学生表.scx; 第二步:添加lable1~lable5,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text5,并设置相关属性; 第四步:添加"院系"、"专业"、"班级"和"学期"列表框; 第五步:添加类,并设置相关属性,用于增添和修改学生基本信息; 第六步:添加文本框text6,并设置相关属性; 第七步:添加command1~command10,并设置相关属性; 第八步:添加"返回"按钮,其功能是关闭此界面; 第九步:执行运行命令,并进行测试。 4、课程信息维护表单的设计: 第一步:创建表单,并保存为课程表.scx; 第二步:添加lable1~lable4,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text4,并设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值