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语句能够成功达到预期的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/753880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘系统架构:从零开始,探索技术世界的无限可能

文章目录 引言一、系统架构的基本概念二、系统架构的设计原则模块化可扩展性高可用性安全性 三、常见的系统架构模式1. **分层架构(Layered Architecture)**:2. **微服务架构(Microservices Architecture)**&#xff1…

【嵌入式DIY实例】-LCD ST7735显示LM35传感器数据

LCD ST7735显示LM35传感器数据 文章目录 LCD ST7735显示LM35传感器数据1、硬件准备与接线2、代码实现本文将介绍如何使用 LM35 模拟温度传感器构建一个简单的温度计,其中温度值打印在 ST7735 TFT 显示屏上(以摄氏度、开尔文度和华氏度为单位)。 ST7735 TFT是一款分辨率为128…

从一万英尺外看libevent(源码刨析)

从一万英尺外看libevent 温馨提示:阅读时间大概二十分钟 前言 Libevent是用于编写高速可移植非阻塞IO应用的库,其设计目标是: 可移植性:使用libevent编写的程序应该可以在libevent支持的所有平台上工作。即使没有好的方式进行非…

使用minio搭建oss

文章目录 1.minio安装1.拉取镜像2.启动容器3.开启端口1.9090端口2.9000端口 4.访问1.网址http://:9090/ 5.创建一个桶 2.minio文件服务基本环境搭建1.创建一个文件模块2.目录结构3.配置依赖3.application.yml 配置4.编写配置类MinioConfig.java,构建minioClient5.Fi…

用Python将PowerPoint演示文稿转换到图片和SVG

PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具,被广泛应用于教育、商务汇报及个人项目展示等领域。然而,面对不同的分享场景与接收者需求,有时需要我们将PPT内容以图片形式保存与传播。这样能够避免软件兼容性的限制&#x…

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

iOS政策解读之三丨商务、设计和法律 “三重奏“

上一篇的iOS政策解读文章,我们从安全和性能两方面进行了学习和解读,这两个方面是最为重要,也是优先级最高的方面。 如果您还没来得及阅读,欢迎移步我们前两篇的解读文章: iOS政策解读之一丨App提交审核前注意事项必知…

建投数据人力资源管理系统APP完成迭代升级

近日,建投数据人力资源管理系统APP完成迭代升级。 此次升级思路,遵循提升移动应用的功能和用户体验;直观的界面、快速的响应速度和安全的数据存储;个性化的功能,以满足不同员工的需求和使用偏好。 人力资源管理系统A…

ozon定价计算器下载,ozon定价计算器

各位电商卖家们,大家好!在这个竞争激烈的电商时代,你是否还在为产品定价而头疼不已?特别是在俄罗斯ozon电商平台,本土与跨境的定价策略更是需要精细把控。今天,就为大家带来一款强大的定价工具——萌啦ozon…

QT QThread 线程类的使用及示例

QThread 是 Qt 框架提供的一个用于处理多线程的类,它允许开发者编写具有并发功能的应用程序,提高程序的响应速度、执行效率和用户体验。 在操作系统中,线程是进程内的执行单元,拥有独立的执行路径。每个线程有自己独立的栈空间&a…

数据库同步最简单的方法

数据库同步到底有咩有简单的方法,有肯定是有的,就看你有咩有缘,看到这篇文章,你就是有缘人。众所周知,数据库同步向来都不是一件简单的事情,它很繁琐,很费精力,很考验经验&#xff0…

unity 导入的模型设置讲解

咱们先讲Model这一栏 Model Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子。 Scale Factor:缩放因子(也就是模型导入后大小如果小了或者大了在这里直接改是相当于该模型的大小的,而且在…

Windows系统开启python虚拟环境

.\env4socre\Scripts\activate : 无法加载文件 E:\SocreMan\env4socre\Scripts\Activate.ps1,因为在此系统上禁止运行脚本。 环境:windows 11、vscode 1、用管理员权限打开powershell 输入set-executionpolicy remotesigned,选择Y 2、返回v…

网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休

01 上海吾索信息科技有限公司 🔷招聘岗位:网络工程师 🔷岗位职责: 1)具备网络系统运维服务经验以及数据库实施经验,具备网络系统认证相关资质或证书; 2)掌握常用各设备的运维巡检…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架,日志输出的pattern里配置了打印调用方法名及代码行号的配置,但是实际输出的日志方法名总是显示? 在强迫症的驱使下,开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11(下):YOLO的入门使用一节中,我们已经了解YOLO的使用方法,使用过程非常简单,训练时只需要三行代码:引入YOLO,构建模型,训练模型;预测…

DevOps CMDB平台整合Jira工单

背景 在DevOps CMDB平台建设的过程中,我们可以很容易的将业务应用所涉及的云资源(WAF、K8S、虚拟机等)、CICD工具链(Jenkins、ArgoCD)、监控、日志等一次性的维护到CMDB平台,但随着时间的推移,…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作:Pointw…

【51单片机入门】点亮数码管

文章目录 前言仿真图如何去绘制一个数字示例代码选择某个数码管显示某个数字 示例代码总结 前言 在嵌入式系统的世界中,单片机扮演着至关重要的角色。51单片机,作为最早的微控制器之一,至今仍被广泛应用在各种设备中。本文将介绍如何使用51单…

嵌入式Linux的浮点运算能力测试

嵌入式Linux的浮点运算能力测试 今天需要对一款ARM CPU的浮点数运算能力进行测试,采用了台式机上常用的SuperPI相同的原理:计算一定小数位数的圆周率来测试硬件的浮点数计算能力和稳定性。 首先下载计算软件的源代码,可以使用下面命令&#…