当前位置: 首页 > news >正文

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
BEGININSERT 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
BEGINIF NEW.grade > 100 OR NEW.grade < 0 THENSIGNAL 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
BEGINIF EXISTS (SELECT 1 FROM Users WHERE username = NEW.username OR email = NEW.email) THENSIGNAL 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 THENSIGNAL 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;

测试结果

相关文章:

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

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

windowns server2016服务器配置php调用powerpoint COM组件

解决问题&#xff1a;windowns server2016服务器配置php调用powerpoint COM组件 环境&#xff1a; windows server2016 宝塔&#xff08;nginxmysqlphp7.2&#xff09; IIS 搭建宝塔&#xff1a; 下载地址&#xff1a;https://www.bt.cn/download/windows.html ​ 安装使用&…...

Git之checkout/reset --hard/clean -f区别(四十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

MySQL数据库基础练习系列:科研项目管理系统

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 邮箱 …...

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…...

【鸿蒙学习笔记】页面和自定义组件生命周期

官方文档&#xff1a;页面和自定义组件生命周期 目录标题 [Q&A] 都谁有生命周期&#xff1f; [Q&A] 什么是组件生命周期&#xff1f; [Q&A] 什么是组件&#xff1f;组件生命周期 [Q&A] 什么是页面生命周期&#xff1f; [Q&A] 什么是页面&#xff1f;页面生…...

ASPICE与ISO 21434:汽车软件与网络安全标准的协同与互补

ASPICE&#xff08;Automotive SPICE&#xff09;与ISO 21434在汽车行业中存在显著的相关性&#xff0c;主要体现在以下几个方面&#xff1a; 共同目标&#xff1a; ASPICE和ISO 21434都旨在提高汽车系统和软件的质量、可靠性和安全性。ASPICE关注汽车软件开发过程的成熟度和…...

视频格式转换方法:如何使用视频转换器软件转换视频

众所周知&#xff0c;目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如&#xff0c;如果不先将其转换为 MP4、MOV 或 M4V 文件&#xff0c;AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…...

vim操作小诀窍:快速多行添加注释

在使用vim编译python代码的时候&#xff0c;经常碰到需要将一段代码注释的情况&#xff0c;每次都要按“向下” “向左”按钮&#xff0c;将光标移到句首&#xff0c;然后再键入#井号键。如果行数较多&#xff0c;则操作相当繁琐。 vim里面有将一段文字前面加#注释的方法&#…...

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

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

Mybatis入门——语法详解:基础使用、增删改查、起别名、解决问题、注释、动态查询,从入门到进阶

文章目录 1.基础使用1.添加依赖2.在resouces文件下新建xml文件db.properties3.在resouces文件下新建xml文件mybatis-config-xml4.创建一个MybatisUtils工具类5.创建xml文件XxxMapper.xml映射dao层接口6.添加日志5.测试 2.增删改查1.select2.delete3.update4.insert5.模糊查询6.…...

仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt

本文主要讲述使用MindOpt工具优化仓库选址的数学规划问题。 视频讲解&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448; 一、案例场景 仓库选址问题在现代物流和供应链管理中具有重要的应用。因为仓库…...

Docker Compose 一键快速部署 RocketMQ

Apache RocketMQ是一个开源的分布式消息中间件系统&#xff0c;最初由阿里巴巴开发并贡献给Apache软件基金会。RocketMQ提供了高性能、高可靠性、高扩展性和低延迟的消息传递服务&#xff0c;适用于构建大规模分布式系统中的消息通信和数据同步。 RocketMQ支持多种消息模型&am…...

Vscode lanuch.json

Intro 使用launch.json 能够方便的运行需要传很多参数的代码文件 如下&#xff1a; import math import argparse # 1、导入argpase包def parse_args():parse argparse.ArgumentParser(descriptionCalculate cylinder volume) # 2、创建参数对象parse.add_argument(--rad…...

Golang开发:构建支持并发的网络爬虫

Golang开发&#xff1a;构建支持并发的网络爬虫 随着互联网的快速发展&#xff0c;获取网络数据成为了许多应用场景中的关键需求。网络爬虫作为一种自动化获取网络数据的工具&#xff0c;也因此迅速崛起。而为了应对日益庞大的网络数据&#xff0c;开发支持并发的爬虫成为了必…...

2024年跨境电商关键数据统计:市场规模将达到1.976万亿美元

预计2024年跨境电商消费市场规模将达到1.976万亿美元&#xff0c;占全球网上销售总额的31.2%。这一数据无疑展示了跨境电商市场的巨大潜力和迅猛增长趋势。 全球跨境电商的现状与未来 现状 2023年&#xff0c;全球跨境电商市场规模预计达到1.56万亿美元&#xff0c;占全球电子…...

联想至像M3070DNA打印机加粉及清零方法

基本参数&#xff1a; 产品类型&#xff1a;黑白激光多功能商用一体机&#xff08;打印/复印/扫描&#xff09; 网络功能&#xff1a;支持有线网络打印 最大处理幅面&#xff1a;A4 双面功能&#xff1a;自动 打印速度&#xff1a;30页/分钟&#xff08;高速激光打印&…...

通过nginx去除 api url前缀 并保持后面剩余的url不变向后台请求

如 我前台浏览器向后台请求的接口是 http://127.0.0.1:5099/api/sample/sample/getbuttonlist 实际的请求接口传向 http://192.168.3.71:5099/sample/sample/getbuttonlist 方法是向config中加入下面这样一个server server {listen 5099;location /api/ {rewrite ^/a…...

AI技术在现代社会中的广泛应用及其影响

目录 前言&#xff1a; 一、AI技术在医疗领域的应用 二、AI技术在教育领域的应用 三、AI技术在工业领域的应用 四、AI技术在金融领域的应用 五、AI技术在生活领域的应用 前言&#xff1a; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术逐渐成为人…...

VBA 批量变换文件名

1. 页面布局 在“main”Sheet中按照下面的格式编辑。 2. 实现代码 Private wsMain As Worksheet Private intIdx As LongPrivate Sub getExcelBookList(strPath As String)Dim fso As ObjectDim objFile As ObjectDim objFolder As ObjectSet fso = CreateObject("Scrip…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...