MySql-学生成绩管理系统

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySql-学生成绩管理系统

前言

暑假的时候学习过这个 MySql 数据库,然后学校这个学期居然开了这门课程,那就做一个学生成绩管理系统来练一练手吧。在这里做一个简单的练习记录。

需求分析

SQL 编写

新建数据库
为该数据库建表
INSERT INTO 数据
创建索引
创建视图
创建触发器
创建存储过程
SQL 查询进行调试

结语

完整代码如下

-- 1. 新建数据库
drop database studentManage;
CREATE DATABASE studentManage;
use studentManage;
-- 2. 创建表
-- 创建班级表
CREATE TABLE classes (
class_id INT PRIMARY KEY,  -- 班级ID,作为主键
class_name VARCHAR(50)  -- 班级名称,最大长度为50个字符
);
-- 插入班级数据
INSERT INTO classes (class_id, class_name) VALUES (0, '尖子班');
INSERT INTO classes (class_id, class_name) VALUES (1, '垃圾班');
INSERT INTO classes (class_id, class_name) VALUES (2, '垃圾班');
INSERT INTO classes (class_id, class_name) VALUES (3, '废物班');
INSERT INTO classes (class_id, class_name) VALUES (4, '废物班');
INSERT INTO classes (class_id, class_name) VALUES (5, '脑残班');
-- 创建学生表
CREATE TABLE students (
student_id INT PRIMARY KEY NOT NULL,  -- 学生ID,作为主键,不允许为空
name VARCHAR(50),  -- 姓名,最大长度为50个字符
class_id INT,  -- 班级ID
age INT,  -- 年龄
FOREIGN KEY (class_id) REFERENCES classes(class_id)  -- 外键关联到班级表的班级ID
);
-- 插入学生数据
INSERT INTO students (student_id, name, class_id, age) VALUES (1, '王八', 5, 19);
INSERT INTO students (student_id, name, class_id, age) VALUES (2, '王一', 1, 20);
INSERT INTO students (student_id, name, class_id, age) VALUES (3, '小六', 0, 18);
INSERT INTO students (student_id, name, class_id, age) VALUES (4, '王五', 2, 19);
INSERT INTO students (student_id, name, class_id, age) VALUES (5, '赵六', 3, 20);
INSERT INTO students (student_id, name, class_id, age) VALUES (6, '小七', 4, 18);
-- 创建教师表
CREATE TABLE teachers (
teacher_id INT PRIMARY KEY NOT NULL,  -- 教师ID,作为主键,不允许为空
teacher_name VARCHAR(50)  -- 教师姓名,最大长度为50个字符
);
-- 插入教师数据
INSERT INTO teachers (teacher_id, teacher_name) VALUES (1, '陈老师');
INSERT INTO teachers (teacher_id, teacher_name) VALUES (2, '杨老师');
INSERT INTO teachers (teacher_id, teacher_name) VALUES (4, '何老师');
INSERT INTO teachers (teacher_id, teacher_name) VALUES (4, '刘老师');
INSERT INTO teachers (teacher_id, teacher_name) VALUES (5, '陈老师');
INSERT INTO teachers (teacher_id, teacher_name) VALUES (6, '周老师');
-- 创建课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY NOT NULL,  -- 课程ID,作为主键,不允许为空
course_name VARCHAR(50),  -- 课程名称,最大长度为50个字符
teacher_id INT,  -- 教师ID
FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id)  -- 外键关联到教师表的教师ID
);
-- 插入课程数据
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (100, '英语', 1);
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (101, '语文', 2);
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (102, '数学', 3);
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (103, '生物', 4);
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (104, '物理', 5);
INSERT INTO courses (course_id, course_name, teacher_id) VALUES (105, '化学', 6);
-- 创建成绩表
CREATE TABLE scores (
student_id INT,  -- 学生ID
course_id INT,  -- 课程ID
score INT,  -- 分数
FOREIGN KEY (student_id) REFERENCES students(student_id),  -- 外键关联到学生表的学生ID
FOREIGN KEY (course_id) REFERENCES courses(course_id)  -- 外键关联到课程表的课程ID
);
-- 插入成绩数据
INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 92);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 1, 8);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 1, 5);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 1, 0);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 1, 8);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 1, 7);
INSERT INTO scores (student_id, course_id, score) VALUES (1, 2, 100);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 8);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 2, 5);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 2, 2);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 2, 8);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 2, 7);
INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 1);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 7);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 10);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 10);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 60);
INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 22);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 71);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 20);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 30);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 40);
INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 14);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 72);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 11);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 11);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 62);
INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 12);
INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 73);
INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 14);
INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 15);
INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 66);
-- 3. 创建索引
-- 为学生表的学生ID创建索引
CREATE INDEX idx_student_id ON students (student_id);
-- 为课程表的课程ID创建索引
CREATE INDEX idx_course_id ON courses (course_id);
-- 为成绩表的学生ID和课程ID创建联合索引
CREATE INDEX idx_student_course ON scores (student_id, course_id);
-- 4. 创建视图
CREATE VIEW class_scores AS    
SELECT     
    c.class_id,     
    c.class_name,     
    COUNT(s.student_id) AS student_count,     
    AVG(sc.score) AS average_score    
FROM     
    classes c    
JOIN     
    students s ON c.class_id = s.class_id    
JOIN
    scores sc ON s.student_id = sc.student_id
GROUP BY     
    c.class_id, c.class_name;
CREATE VIEW teacher_courses AS  
SELECT   
    t.teacher_id,   
    t.teacher_name,   
    COUNT(c.course_id) AS course_count  
FROM   
    teachers t  
JOIN   
    courses c ON t.teacher_id = c.teacher_id  
GROUP BY   
    t.teacher_id, t.teacher_name;
-- 5. 创建触发器
DELIMITER //  
CREATE TRIGGER check_student_class_id_after_insert  
AFTER INSERT ON students  
FOR EACH ROW  
BEGIN  
    IF NEW.class_id IS NULL OR NEW.class_id = 0 THEN  
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '必须为新学生分配班级ID';  
    END IF;  
END;  
//  
DELIMITER ;
DELIMITER //  
CREATE TRIGGER check_course_name_length_before_update  
BEFORE UPDATE ON courses  
FOR EACH ROW  
BEGIN  
    IF NEW.course_name IS NOT NULL AND LENGTH(NEW.course_name) > 50 THEN  
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '课程名称长度不能超过50个字符';  
    END IF;  
END;  
//  
DELIMITER ;
DELIMITER //  
CREATE TRIGGER check_student_scores_after_delete  
AFTER DELETE ON students  
FOR EACH ROW  
BEGIN  
    DECLARE score_count INT;  
    SELECT COUNT(*) INTO score_count FROM scores WHERE student_id = OLD.student_id;  
    IF score_count > 0 THEN  
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '不能删除有分数记录的学生';  
    END IF;  
END;  
//  
DELIMITER ;
-- 6. 创建存储函数
-- 存储过程1 - 添加学生
DELIMITER //
CREATE PROCEDURE add_student (
    IN p_student_id INT,
    IN p_name VARCHAR(50),
    IN p_class_id INT,
    IN p_age INT
)
BEGIN
    INSERT INTO students (student_id, name, class_id, age) VALUES (p_student_id, p_name, p_class_id, p_age);
END //
DELIMITER ;
-- 存储过程2 - 添加课程
DELIMITER //
CREATE PROCEDURE add_course (
    IN p_course_id INT,
    IN p_course_name VARCHAR(50),
    IN p_teacher_id INT
)
BEGIN
    INSERT INTO courses (course_id, course_name, teacher_id) VALUES (p_course_id, p_course_name, p_teacher_id);
END //
DELIMITER ;
-- 存储过程3 - 添加成绩
DELIMITER //
CREATE PROCEDURE add_score (
    IN p_student_id INT,
    IN p_course_id INT,
    IN p_score INT
)
BEGIN
    INSERT INTO scores (student_id, course_id, score) VALUES (p_student_id, p_course_id, p_score);
END //
DELIMITER ;
-- 数据更新
-- 更新学生的姓名
UPDATE students SET name = '新名字' WHERE student_id = 1;
-- 更新学生的班级
UPDATE students SET class_id = 1 WHERE student_id = 2;
-- 更新学生的年龄
UPDATE students SET age = 21 WHERE student_id = 3;
-- 更新课程的名称
UPDATE courses SET course_name = '历史' WHERE course_id = 100;
-- 更新课程的教师
UPDATE courses SET teacher_id = 2 WHERE course_id = 101;
-- 更新成绩
UPDATE scores SET score = 90 WHERE student_id = 1 AND course_id = 100;
-- 查询特定学生的信息:
SELECT * FROM students WHERE student_id = 1;
--  查询特定课程的信息:
SELECT * FROM courses WHERE course_id = 5;
-- 查询特定学生在特定课程上的成绩:
SELECT scores.score   
FROM scores   
JOIN students ON scores.student_id = students.student_id   
JOIN courses ON scores.course_id = courses.course_id   
WHERE students.student_id = 1 AND courses.course_id = 5;
-- 查询某个班级的所有学生信息:
SELECT * FROM students WHERE class_id = 1;
-- 查询某个教师的所有课程信息:
SELECT courses.* FROM courses JOIN teachers ON courses.teacher_id = teachers.teacher_id WHERE teachers.teacher_name = '刘老师';
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
160 0
|
21天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
66 3
|
1月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
31 2
|
1月前
|
Ubuntu 关系型数据库 MySQL
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
172 1
|
1月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
137 5
|
1月前
|
关系型数据库 MySQL Linux
Linux系统绿色安装MySQL 8.0.39
Linux系统绿色安装MySQL 8.0.39
|
1月前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
44 2
|
2月前
|
数据采集 中间件 关系型数据库
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
|
1月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
208 0
|
3月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App