MySQL数据库基础练习系列——教务管理系统

项目名称与项目简介

教务管理系统是一个旨在帮助学校或教育机构管理教务活动的软件系统。它涵盖了学生信息管理、教师信息管理、课程管理、成绩管理以及相关的报表生成等功能。通过该系统,学校可以更加高效地处理教务数据,提升教学质量和管理水平。

1.新建ER图表和数据库模型图。

Chen's 数据库表示法——ER图绘制使用形

Crow's Foot数据库表示法——数据库模型图使用形状

2.DDL和DML语句

DDL语句

CREATE TABLE Users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '密码',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    email VARCHAR(100) UNIQUE COMMENT '邮箱',
		phone VARCHAR(20) NOT NULL COMMENT '手机号',
		address VARCHAR(200) NOT NULL COMMENT '地址'
);
 
CREATE TABLE Roles (
    role_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '角色ID',
    role_name VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称'
);
 
CREATE TABLE `userroles` (
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `role_id` int(11) NOT NULL COMMENT '角色ID',
  `userroles_id` int(8) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`userroles_id`) USING BTREE,
  KEY `role_id` (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
 
CREATE TABLE Courses (
    course_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID',
    course_name VARCHAR(100) NOT NULL UNIQUE COMMENT '课程名称',
    course_code VARCHAR(50) NOT NULL UNIQUE COMMENT '课程代码',
		teacher_id INT NOT NULL UNIQUE COMMENT '教师ID',
		credit DECIMAL(3,1) NOT NULL COMMENT '学分',
    description TEXT COMMENT '课程描述'
);
 
CREATE TABLE Teachers (
    teacher_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '教师ID',
    user_id INT NOT NULL COMMENT '关联的用户ID',
    subject VARCHAR(100) NOT NULL COMMENT '教学科目',
    qualification VARCHAR(255) COMMENT '教师资质',
		teacherPhone VARCHAR(20) NOT NULL COMMENT '教师手机号',
		gender ENUM('男', '女') NOT NULL COMMENT '性别',
    FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
 
CREATE TABLE Students (
    student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID',
    user_id INT NOT NULL COMMENT '关联的用户ID',
    class VARCHAR(50) NOT NULL COMMENT '班级',
    year_of_entry YEAR NOT NULL COMMENT '入学年份',
		gender ENUM('男', '女') NOT NULL COMMENT '性别',
		phone VARCHAR(20) NOT NULL COMMENT '手机号',
		address VARCHAR(200) NOT NULL COMMENT '地址',
    FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
 
CREATE TABLE Grades (
    grade_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '成绩ID',
    student_id INT NOT NULL COMMENT '学生ID',
    course_id INT NOT NULL COMMENT '课程ID',
    grade DECIMAL(5, 2) NOT NULL COMMENT '成绩',
    FOREIGN KEY (student_id) REFERENCES Students(student_id),
    FOREIGN KEY (course_id) REFERENCES Courses(course_id)
);

DML语句

-- Users 表
INSERT INTO Users (username, password, gender, email, phone, address)
VALUES
    ('甄嬛', '123', '女', 'zhenhuan@example.com', '1234567890', '河北'),
    ('雍正', '456', '男', 'yongzheng@example.com', '0987654321', '山东'),
    ('苏培盛', '789', '男', 'supershy@example.com', '1122334455', '河北'),
    ('年世兰', '121', '女', 'nianshilan@example.com', '5544332211', '四川'),
    ('允礼', '113', '男', 'yunli@example.com', '6677889900', '上海'),
    ('沈眉庄', '125', '女', 'shenmeizhuang@example.com', '0099887766', '贵州'),
    ('安陵容', '486', '女', 'anlingrong@example.com', '1357924680', '山东'),
    ('乌兰那拉·宜修', '女', '女', 'yixiu@example.com', '0246813579', '重庆'),
    ('温实初', '415', '男', 'win10chu@example.com', '9876543210', '河北'),
    ('浣碧', '785', '女', 'huanbi@example.com', '0123456789', '河北');
 
-- Roles 表
INSERT INTO roles VALUES(0,'学生1');
INSERT INTO roles VALUES(0,'教师2');
INSERT INTO roles VALUES(0,'管理员3');
 
-- UserRoles 表
INSERT INTO UserRoles (user_id, role_id) VALUES
(1, 1), -- 管理员
(2, 2), -- 教师
(3, 3); -- 学生
 
-- Courses 表
INSERT INTO Courses (course_name, course_code, teacher_id, credit, description)
VALUES
    ('数学', 'MAT101', 1, 2.5, '基础数学课程'),
    ('英语', 'ENG101', 2, 3.0, '基础英语课程'),
    ('物理', 'PHY101', 3, 4.0, '大学物理'),
    ('化学', 'CHE101', 4, 2.0, '普通化学'),
    ('计算机科学', 'CS101', 5, 4.5, '计算机入门'),
    ('生物学', 'BIO101', 6, 1.0, '生物学基础'),
    ('历史', 'HIS101', 7, 1.5, '世界历史'),
    ('经济学', 'ECO101', 8, 3.5, '微观经济学'),
    ('艺术史', 'ART101', 9, 5.0, '艺术发展历程'),
    ('心理学', 'PSY101', 10, 5.5, '心理学导论');
 
-- Teachers 表
INSERT INTO Teachers (user_id, subject, qualification, teacherPhone, gender)
VALUES
    (1, '数学', '博士', '1111111111', '男'),
    (2, '英语', '硕士', '2222222222', '女'),
    (3, '物理', '教授', '3333333333', '男'),
    (4, '化学', '副教授', '4444444444', '女'),
    (5, '计算机科学', '专家', '5555555555', '男'),
    (6, '生物学', '博士', '6666666666', '女'),
    (7, '历史', '教授', '7777777777', '男'),
    (8, '经济学', '硕士', '8888888888', '女'),
    (9, '艺术史', '专家', '9999999999', '男'),
    (10, '心理学', '博士', '0000000000', '女');
 
-- Students 表
INSERT INTO Students (user_id, class, year_of_entry, gender, phone, address)
VALUES
    (1, '一班', 2023, '男', '1122334455', 'address11'),
    (2, '二班', 2022, '女', '2233445566', 'address12'),
    (3, '三班', 2021, '男', '3344556677', 'address13'),
    (4, '四班', 2020, '女', '4455667788', 'address14'),
    (5, '五班', 2019, '男', '5566778899', 'address15'),
    (6, '六班', 2018, '女', '6677889900', 'address16'),
    (7, '七班', 2017, '男', '7788990011', 'address17'),
    (8, '八班', 2016, '女', '8899001122', 'address18'),
    (9, '九班', 2015, '男', '9900112233', 'address19'),
    (10, '十班', 2014, '女', '0011223344', 'address20');
 
-- Grades 表
INSERT INTO Grades (student_id, course_id, grade) VALUES
(1, 1, 90.00),
(1, 2, 85.00),
(2, 3, 88.00),
(2, 4, 87.00),
(7, 8, 99.00),
(8, 9, 88.00),
(9, 10,85.00),
(4, 6, 75.00),
(5, 2, 100.00),
(6, 9, 99.00);

3.简单查询与多表联合复杂查询。

-- 简单查询:查询所有用户的信息,仅显示用户的姓名,性别和手机号,用中文显示列名
SELECT username '用户姓名', gender '性别', phone '手机号' FROM users;
 
 
-- 复杂查询:查询2020 年入学的学生的成绩信息
SELECT s.student_id '学生id', s.class '班级', g.course_id '课程id', g.grade '成绩'
FROM Students s
JOIN Grades g ON s.student_id = g.student_id
WHERE s.year_of_entry = 2020;  -- 使用 WHERE 子句筛选出入学年份为 2020 年的学生
/*
上述查询首先使用 JOIN 操作将 Students 表和 Grades 表基于 student_id 进行关联。
然后通过 WHERE 子句指定条件,只选取入学年份为 2020 年的学生的相关记录。
最后选择要显示的列,包括学生 ID、所在班级、课程 ID 和成绩。
*/

运行结果

4.触发器

触发器1: 当在Students表中插入新记录时,在Grades表中为新学生添加默认课程的成绩。

DELIMITER //
CREATE TRIGGER after_student_insert
AFTER INSERT ON Students
FOR EACH ROW
BEGIN
    INSERT INTO Grades (student_id, course_id, grade)
    VALUES (NEW.student_id, 1, 0.00);
END;
//
DELIMITER ;


测试语句1:在学生表中插入新学生时,自动在Grades表中为这些学生添加默认的course_id为1的课程的成绩(假设为0)。

-- 测试语句
INSERT INTO Students (user_id, class, year_of_entry, gender, phone, address)
VALUES (11, '十一班', 2024, '男', '12345678901', '测试地址');


-- 检查是否成功在Grades表中插入了对应学生的记录
SELECT * FROM Grades WHERE student_id = 11;

测试结果1:

触发器2: 当尝试更新Grades表中的成绩时,如果成绩超过100或小于0,则阻止更新。

DELIMITER //
CREATE TRIGGER before_grade_update
BEFORE UPDATE ON Grades
FOR EACH ROW
BEGIN
    IF NEW.grade > 100 OR NEW.grade < 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '成绩必须在0到100之间!';
    END IF;
END;
//
DELIMITER ;


测试语句2:当修改学生成绩时,如果成绩超过100或小于0,则阻止更新

-- 测试语句(尝试将成绩更新为101,应该失败)
UPDATE Grades SET grade = 101 WHERE student_id = 1 AND course_id = 1;

测试结果2

触发器3:确保插入Users表的用户具有唯一的用户名和邮箱

DELIMITER //
CREATE TRIGGER trg_check_user_unique
BEFORE INSERT ON Users
FOR EACH ROW
BEGIN
    IF EXISTS (SELECT 1 FROM Users WHERE username = NEW.username OR email = NEW.email) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Username or email already exists';
    END IF;
END //
DELIMITER ;

测试语句3:尝试插入一个已存在的用户名或邮箱应该会导致错误。

INSERT INTO Users (username, password, gender, email, phone, address)
VALUES ('甄嬛', 'new_password', '女', 'zhenhuan@example.com', '12345678901', '新地址');  -- 这会失败,因为用户名已存在

测试结果3:

5.存储过程它用于向Grades表中插入一条新的成绩记录

DELIMITER //
CREATE PROCEDURE InsertGrade(
    IN p_student_id INT,
    IN p_course_id INT,
    IN p_grade DECIMAL(5, 2)
)
BEGIN
    -- 检查参数是否有效
    IF p_student_id IS NULL OR p_course_id IS NULL OR p_grade IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid input. All parameters must be provided.';
    END IF;

    -- 插入成绩
    INSERT INTO Grades (student_id, course_id, grade)
    VALUES (p_student_id, p_course_id, p_grade);

    -- 如果需要,可以在这里添加其他逻辑,比如检查是否已经存在相同的成绩记录等

    -- 返回结果
    SELECT 'Grade inserted successfully.' AS message;
END //
DELIMITER ;

测试语句:插入操作使用INSERT INTO ... VALUES语句。插入后,可以选择性地添加其他逻辑,比如检查是否已经存在相同的成绩记录。最后,它返回一个表示成功的消息。


-- 调用存储过程插入一个新的成绩记录
CALL InsertGrade(11, 1, 95.00);  -- 假设有一个学生ID为11的学生和课程ID为1的课程


-- 查询Grades表以验证是否插入成功
SELECT * FROM Grades WHERE student_id = 11 AND course_id = 1;

测试结果

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

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

相关文章

uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值

一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码&#xff0c;下载提供查看到的密钥证书密码就可以了&#xff01;下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名&#xff0c;your_keystore.keystore 改成自己的证书文件…

炸裂行情,只涨指数难涨票!你的股票涨了吗?

今天的A股&#xff0c;让人愣住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股冲高回落&#xff0c;很多人愣住了&#xff0c;别慌&#xff01;主力增量在不断增加&#xff0c;7月的一波主线反弹正…

小程序web-view无法打开该页面的解决方法

问题&#xff1a;开发者工具可以正常打开&#xff0c;正式上线版小程序使用 web-view 组件测试时提示&#xff1a;“无法打开该页面&#xff0c;不支持打开 https://xxxxxx&#xff0c;请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 解决方法&#xff1a;需要配…

计网实训——不相同网段的PC相互通信

目录 提前准备APP路由器指令 实验一1、实验需求&#xff08;1&#xff09;实现同网段的PC相互通信。&#xff08;2&#xff09;实现不相同网段的PC相互通信。&#xff08;3&#xff09;分析相同和不同网段PC通信时MAC地址的变化。 2、实验拓扑3、实验步骤及实验截图&#xff08…

金顺心贸易有限公司简介

金顺心贸易有限公司成立于2015年&#xff0c;注册地位于风景如画的广西壮族自治区防城港市东兴市。 金顺心贸易如他们的名字一样&#xff0c;有着实实在在的业绩和口碑的。他们专注于国际贸易&#xff0c;主营越南进口食品&#xff1a;果汁饮料、春卷皮、调味品、汤底、米粉、…

【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141&#xff1a;环形链表3、leetcode881&#xff1a;救生艇 1、双指针算法 用两个指针来共同解决一个问题&#xff1a; 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

# Kafka_深入探秘者(10):kafka 监控

Kafka_深入探秘者&#xff08;10&#xff09;&#xff1a;kafka 监控 一、kafka JMX 1、JMX &#xff1a;全称 Java Managent Extension 在实现 Kafka 监控系统的过程中&#xff0c;首先我们要知道监控的数据从哪来&#xff0c;Kafka 自身提供的监控指标(包括 broker 和主题的…

Zabbix如何帮助企业将监控数据转化为竞争优势

By Fernanda Moraes 在我们生活的高度互联世界中&#xff0c;变化以越来越快和激烈的速度发生。这影响了消费者的认知与行为&#xff0c;迫使零售商寻找更有效的方式来吸引客户。Linx 是 StoneCo 集团旗下的一家公司&#xff0c;也是零售技术专家&#xff0c;Linx了解这一点&am…

无线麦克风领夹哪个牌子好,2024年领夹麦克风品牌排行榜推荐

​随着短视频热潮的兴起&#xff0c;越来越多的人倾向于用vlog记录日常生活&#xff0c;同时借助短视频和直播平台开辟了副业。在这一过程中&#xff0c;麦克风在近两年内迅速发展&#xff0c;从最初的简单收音功能演变为拥有多样款式和功能&#xff0c;以满足视频创作的需求。…

数据脱敏学习

数据脱敏是一种保护敏感信息的方法&#xff0c;它通过修改或删除数据中的敏感部分&#xff0c;使得数据在保持一定可用性的同时&#xff0c;不再直接关联到个人隐私或重要信息。 自然人指可以直接或间接标识 直接标识&#xff1a;如姓名、身份证号码、家庭住址、电话号码、电…

生命在于折腾——Macbook虚拟机开启360核晶

首先启动PD虚拟机&#xff0c;打开360&#xff0c;发现提示如下&#xff1a; 此时将虚拟机关机。 打开该虚拟机设置&#xff1a; 将虚拟机监控程序改为Parallels&#xff0c;并启动nested虚拟化。 改好后截图如下&#xff1a; 保存设置&#xff0c;开机 此时就可以开启了…

手机恢复已删除数据,3种情况下的解决办法,史诗级教程

手机已经变成了我们生活中的“黑匣子”&#xff0c;记录着我们的通讯录、照片、视频、聊天记录等各种重要数据。然而&#xff0c;由于误删、系统崩溃或其他不可预测的情况&#xff0c;我们可能会面临数据丢失的风险。 本文将为你提供一份史诗级的教程&#xff0c;详细介绍3种不…

10种超强图像特征提取算法Python代码实现

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 图像特征提取是计算机视觉和图像处理的关键步骤&#xff0c;因…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

Nginx反向代理实现Vue跨域注意事项

1、通过搜索引擎访问Nginx官网——免费使用——NGINX开源版(免费下载)或者通过以下链接直接访问Nginx下载页面下载对应的版本(下载页面)。以下以1.24.0为例 2、修改nginx的配置文件&#xff0c;在conf文件夹下&#xff0c;文件名为nginx.conf&#xff1b;以下是我修改完的配置…

【Python数据分析与可视化】:使用【Matplotlib】实现销售数据的全面分析 ——【Matplotlib】数模学习

目录 安装Matplotlib 1.打开PyCharm&#xff1a; 2.打开终端&#xff1a; 3.安装Matplotlib&#xff1a; 4.确认安装&#xff1a; 导入Matplotlib 创建简单的折线图 代码解析&#xff1a; 创建子图 代码解析&#xff1a; 创建柱状图 代码解析&#xff1a; 创建散点…

总结一下Linux、Windows、Ubuntu、Debian、CentOS等到底是啥?及它们的区别是什么

小朋友你总是有很多问好 你是否跟我一样&#xff0c;不是计算机科班出身&#xff0c;很多东西都是拿着在用&#xff0c;并不知道为什么&#xff0c;或者对于它们的概念也是稀里糊涂的&#xff0c;比如今天说的这个。先简单描述下&#xff0c;我先前的疑问&#xff1a; Linux是…

《昇思25天学习打卡营第9天 | 昇思MindSpore使用静态图加速》

第九天 本节了解到AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。 1.动态图模式 动态图的特点是计算图的构建和计算同时发生&#xff08;Define by run&#xff09…

Studying-代码随想录训练营day23| 39.组合总和、40.组合总和II、131.分割回文串

第23天&#xff0c;回溯part02&#xff0c;回溯两个题型组合&#xff0c;切割(ง •_•)ง&#x1f4aa; 目录 39.组合总和 40.组合总和II 131.分割回文串 总结 39.组合总和 文档讲解&#xff1a;代码随想录组合总和 视频讲解&#xff1a;手撕组合总和 题目&#xff1a;…

一文汇总VSCode多光标用法

光标的创建 按住alt&#xff0c;鼠标左键单击&#xff0c;在单击位置生成光标/删除光标 按住ctrlalt&#xff0c;单击↑/↓&#xff0c;在每行同一个位置&#xff08;若某一行较短&#xff0c;则在行尾&#xff09;生成光标&#xff0c;这个不会删除光标&#xff0c;只会在光标…