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;

测试结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5款提高工作效率的免费工具推荐

SimpleTex SimpleTex是一款用于创建和编辑LaTeX公式的简单工具。它能够识别图片中的复杂公式并将其转换为可编辑的数据格式。该软件提供了一个直观的界面&#xff0c;用户可以在编辑LaTeX代码的同时实时预览公式的效果&#xff0c;无需额外的编译步骤。此外&#xff0c;SimpleT…

生命在于学习——Python人工智能原理(2.5.1)

五、Python的类与继承 5.1 Python面向对象编程 在现实世界中存在各种不同形态的事物&#xff0c;这些事物之间存在各种各样的联系。在程序中使用对象来映射现实中的事物&#xff0c;使用对象之间的关系描述事物之间的联系&#xff0c;这种思想用在编程中就是面向对象编程。 …

C++笔记:实现一个字符串类(构造函数、拷贝构造函数、拷贝赋值函数)

实现一个字符串类String&#xff0c;为其提供可接受C风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。 声明依赖文件 其中ostream库用于打印标准输入输出&#xff0c;cstring库为C风格的字符串库 #include <iostream> #include <cstring> 声明命…

【python】OpenCV—Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础&#xff08;18&#xff09;使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…

骨传导耳机哪个牌子值得入手?精选热销榜TOP5推荐!

短短数年&#xff0c;骨传导耳机的市场规模迅速扩大&#xff0c;其受欢迎程度可见一斑。但身为拥有十二年经验的音频专家&#xff0c;我在此有义务提醒大家&#xff0c;在选择骨传导耳机时一定要谨慎。面对市面上的众多品牌&#xff0c;一定不要盲目入手&#xff0c;不然很容易…

leetcode提速小技巧

据我所知&#xff0c;leetcode可能是按最难那个用例给你打分的&#xff0c;非难题的用时好坏不完全看复杂度&#xff0c;因为可能都差不多&#xff0c;O(n/2)和O(n)虽然都是O(n)&#xff0c;但是反应到成绩上是不同的&#xff0c;所以&#xff0c;尽可能的在条件足够的情况下提…

Java鲜花下单预约系统源码小程序源码

让美好触手可及 &#x1f338;一、开启鲜花新篇章 在繁忙的都市生活中&#xff0c;我们总是渴望那一抹清新与美好。鲜花&#xff0c;作为大自然的馈赠&#xff0c;总能给我们带来无尽的惊喜与愉悦。但你是否曾因为工作繁忙、时间紧张而错过了亲自挑选鲜花的机会&#xff1f;今…

KVB交易平台: 美元兑日元升破161,这一趋势会继续吗?

在2024年6月28日&#xff0c;美元在亚洲交易市场中表现强劲&#xff0c;接近四十年来的新高&#xff0c;预计将连续第二个季度上涨。与此同时&#xff0c;日本日元持续走低&#xff0c;跌至38年以来的新低&#xff0c;首次突破161关口。在东京交易中&#xff0c;日元兑美元贬值…

小程序反编译后报错“_typeof3 is not a function”

详情->本地设置->取消勾选“将JS编译成ES5” 参考链接&#xff1a;https://blog.csdn.net/csl12919/article/details/131569914

Ubuntu网络管理命令:netstat

安装Ubuntu桌面系统&#xff08;虚拟机&#xff09;_虚拟机安装ubuntu桌面版-CSDN博客 顾名思义&#xff0c;netstat命令不是用来配置网络的&#xff0c;而是用来查看各种网络信息的&#xff0c;包括网络连接、路由表以及网络接口的各种统计数据等。 netstat命令的基本语法如…

湿气易藏在身体的这3个地方,1个方法“定位祛湿”,摆脱它!

6月的雨&#xff0c;滴滴答答的下了十几天了&#xff0c;体内湿气越来越重&#xff0c;皮肤发痒、身体沉重、四肢乏力、总犯困、还出现了消化不良&#xff0c;甚至腹泻的情况…… 为什么我都在积极喝祛湿汤&#xff0c;却不见效呢&#xff1f; 一个很重要的原因可能是&#xff…

「ETL趋势」FDL数据开发支持版本管理、实时管道支持多对一、数据源新增支持神通

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.8最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

企业出海的浪潮下,如何利用亚马逊云(AWS)更好地应对?

在全球化的浪潮下&#xff0c;越来越多的企业开始将目光投向国际市场。在这个数字化时代&#xff0c;云计算技术成为企业出海的必备利器之一。AWS云作为全球领先的云服务提供商&#xff0c;凭借其卓越的性能和完善的服务体系&#xff0c;成为众多企业出海的首选。 一、出海为什…

CDN入门

在腾讯云上使用CDN 1、参考 内容分发网络 CDN 从零开始配置 CDN-快速入门-文档中心-腾讯云 2、验证 访问&#xff1a; 登录 - 腾讯云 Window10本地电脑使用命令验证 nslookup -qt-cname hmblogs.com.cn Ubuntu下验证 dig hmblogs.com.cn

SpringBoot整合Solr进行搜索(简单)

SpringBoot整合Solr进行搜索 创建SpringBoot项目pom中加入Solr依赖配置 Solr创建实体编写一个简单的ID查询打印结果 参考文章 创建SpringBoot项目 这里基于aliyun提供的快速构建一个项目。我们这主要是整合Solr。 pom中加入Solr依赖 maven下载地址 pom中加入以下内容&#x…

「ETL趋势」FDL定时任务区分开发/生产模式、API输入输出支持自定义响应解析

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.7最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

鸿蒙开发设备管理:【@ohos.brightness (屏幕亮度)】

屏幕亮度 该模块提供屏幕亮度的设置接口。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from ohos.brightness;brightness.setValue setValue(value: number):…

【ai】ubuntu18.04 找不到 nvcc --version问题

nvcc --version显示command not found问题 这个是cuda 库: windows安装了12.5 : 参考大神:解决nvcc --version显示command not found问题 原文链接:https://blog.csdn.net/Flying_sfeng/article/details/103343813 /usr/local/cuda/lib64 与 /usr/local/cuda-11.3/lib64 完…

数据挖掘常见算法(聚类)

划分方法 K-均值算法(K-means算法) 方法: 首先选择K个随机的点,称为聚类中心.对于数据集中的,每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类.计算每一个组的平均值,将改组所关联的中心点移动到平均值的位置重复2~…

《昇思25天学习打卡营第7天 | 昇思MindSpore模型训练》

第七天 之前学习了模型训练的构建数据集&#xff0c;定义神经网络模型。本节学习了定义超参、损失函数及优化器&#xff0c;输入数据集进行训练与评估。 模型训练的步骤 1.构建数据集 2.定义神经网络模型 3.定义超参、损失函数及优化器 4.输入数据集进行训练与评估