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

news2024/11/17 10:25:16

项目名称与项目简介

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

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.coloradmin.cn/o/1868080.html

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

相关文章

zabbix 7.0 新增功能亮点(三)— 监控项支持SNMP Hex数据预处理

作者 乐维社区&#xff08;forum.lwops.cn&#xff09; 许远 勇敢的人先享受世界&#xff0c;好奇心促使你探索未知的世界。zabbix 7.0 LTS发布已经有一段时间了。不得不说zabbix7.0作为一款开源监控工具而言是真的强大又丝滑&#xff0c;其中不少新特性嘎嘎溜&#xff0c;让人…

【深度学习】基于深度离散潜在变量模型的变分推理

1.引言 1.1.讨论的目标 阅读并理解本文后&#xff0c;大家应能够&#xff1a; 掌握如何为具有离散潜在变量的模型设定参数在可行的情况下&#xff0c;使用精确的对数似然函数来估计参数利用神经变分推断方法来估计参数 1.2.导入相关软件包 # 导入PyTorch库&#xff0c;用于…

XX能源云数据平台建设项目_投标书_技术部分(194页word)

标书介绍&#xff1a; 该标书通过物联网技术&#xff0c;实时采集能源行业各类数据&#xff0c;并进行标准化整合。采用分布式存储技术&#xff0c;确保数据的安全性和可扩展性。运用大数据和人工智能技术&#xff0c;对数据进行深度分析和挖掘&#xff0c;提供有价值的业务洞…

基于springboot、logback的日志脱敏组件

Logback⽇志数据脱敏⼯具&#xff1a;隐私和安全的守护者 概述 在涉及敏感数据的⽇志记录环境中&#xff0c;数据保护和个⼈隐私⽆疑是⾄关重要的领域。确保敏感数据不被泄露&#xff0c;脱敏处理成为必不可少的⼀步。数据脱敏是⼀种技术⼿段&#xff0c;其将敏感信息转换为不…

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

Linux系统iptables应用SNAT和DNAT

一、SNAT 1.SNAT应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) 2.SNAT原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由私…

AI产品打造全攻略:看我是如何预测用户流失,搞定AI产品全流程的

前言 对于任何互联网公司而言&#xff0c;用户流失无疑是一个不容忽视的问题。在本文中&#xff0c;我将通过一个真实的预测用户流失的项目案例&#xff0c;带领大家深入了解AI产品从筹备到上线的整个流程。这个过程将展现AI产品经理的工作全貌&#xff0c;包括各个环节的角色…

汇编语言作业(十一)

目录 一、实验目的 二、实验内容 三&#xff0e;实验步骤以及结果 1、编译器换用vscode&#xff0c;但我现在只能把vscode当成代码编辑器来用&#xff0c;运行、调试都不成功。 2、本文是参考这份博客写的代码&#xff1a; 四、实验结果与分析 五&#xff0e;实验总结 一…

【AI绘画SD】解锁AIGC写实摄影要素:摄影构图与视角关键提示,SD3模型最新体验

大家好我是安琪&#xff01; 摄影构图与角度介绍 在现实摄影领域中&#xff0c;创作出优秀的摄影图像会涉及很多关键技术要素&#xff0c;如&#xff1a;光影效果、摄影构图&#xff08;摄影机位置&#xff1a;相机与主体的距离&#xff09;和摄影角度&#xff08;相机相对于…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

nuxt3项目打包后获取.env设置的环境变量无效的解决办法

问题描述 在nuxt3项目开发过程中&#xff0c;设置了开发环境变量和生产环境变量&#xff0c;在本地开发时都能正常获取&#xff0c;但打包部署时获取不到&#xff0c;设置如下&#xff1a; //.env.development文件示例 SERVER_API_PATHhttp://192.168.25.100//.env.productio…

从挑战到实战!TDengine 新能源行业研讨会要点回顾

近年来&#xff0c;随着全球对可再生能源需求的不断增长&#xff0c;新能源行业迎来了前所未有的发展机遇。然而&#xff0c;伴随着行业的快速发展&#xff0c;海量数据的管理和高效利用成为了行业面临的重要挑战。如何通过先进的数据管理技术提升新能源系统的效率和可靠性&…

Qt开发 | Qmake与CMake | Qt窗口基类 | VS Qt项目与QtCreator项目相互转化 | Qt架构 | Qt学习方法

文章目录 一、Qmake与CMake介绍1.Qmake2.CMake3.使用qmake还是cmake&#xff1f; 二、Qt3个窗口基类的区别三、vs qt与QtCreator项目相互转化方法1.QtCreator项目转VS Qt2.VS Qt项目转QtCreator项目 四、Qt架构介绍与学习方法详解 一、Qmake与CMake介绍 Qmake和CMake都是构建系…

iOS项目开发遇到问题杂项坑点记录

ios17 弹窗UIAlertController展示逻辑变化&#xff0c;单个词一行展示不下不换行&#xff08;这前版本会换行&#xff09;&#xff0c;直接截断超出部分。 UINavigationController push立刻pop会异常&#xff0c;使用用setViewCollerllers可以避免这个问题 键盘切换后立刻切页…

【java算法专场】双指针(上)

目录 前言 基本原理 对撞指针 快慢指针 移动零 算法思路 算法步骤 代码实现 算法分析 复写零 算法思路 算法步骤 代码实现 快乐数 算法思路 算法步骤 代码实现 盛最多水的容器 ​编辑算法思路 代码实现 前言 双指针是一种在数组或链表等线性数据结构中高效…

GGUF模型转换入门

一、定义 1 定义 2 案例 二、实现 定义 GGUF是一种大模型文件格式&#xff0c;由开发者Georgi Gerganov提出。 这是一种针对大规模机器学习模型设计的二进制格式文件规范。它的主要优势在于能够将原始的大模型预训练结果经过特定优化后转换成这种格式&#xff0c;从而可以更…

jpg压缩的快速方法,分享4个!

在数字化时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;高质量的图片往往伴随着较大的文件大小&#xff0c;这在一定程度上影响了网页的加载速度和用户体验。为了解决这一问题&#xff0c;我们为大家精心挑选了4款jpg压缩软件&#xff0c;让你…

3种电脑截屏的快捷方式,告别繁琐操作,你值得拥有

无论是记录重要信息、分享有趣瞬间&#xff0c;还是制作教程和报告&#xff0c;截屏都是不可或缺的工具。当你想要迅速捕捉屏幕上的精彩瞬间&#xff0c;却发现不知如何截屏&#xff0c;是不是感到有些头疼&#xff1f;今天&#xff0c;就让小编揭晓3种电脑截屏的快捷方式&…

赏金猎人src挖掘入门

文章目录 1. 什么是漏洞2. OWASP Top 103. 利用的漏洞来源4. SRC安全应急响应中心5. Burpsuite简介6. 浏览器代理插件6.1 firefox浏览器代理插件6.2 edge浏览器代理插件3.chrome浏览器代理插件&#xff08;需要科学上网&#xff09; 1. 什么是漏洞 漏洞是指一个系统存在的弱点或…

springboot社区维修平台

设计技术&#xff1a; springboot、mysql、maven、前端vue 主要功能&#xff1a; 住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理等功能模块。 管理员功能模块 管理员通过后台登录页面…