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 '邮箱'
);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 COMMENT '用户ID',role_id INT COMMENT '角色ID',PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES Users(user_id),FOREIGN KEY (role_id) REFERENCES Roles(role_id)
);CREATE TABLE Projects (project_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '项目ID',project_name VARCHAR(100) NOT NULL COMMENT '项目名称',project_description TEXT COMMENT '项目描述',principal_investigator_id INT COMMENT '主研人ID',start_date DATE NOT NULL COMMENT '开始日期',end_date DATE NOT NULL COMMENT '结束日期',status ENUM('申请中', '审批中', '执行中', '结题') NOT NULL COMMENT '项目状态',FOREIGN KEY (principal_investigator_id) REFERENCES Users(user_id)
);CREATE TABLE Funds (fund_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '资金ID',project_id INT NOT NULL COMMENT '项目ID',source VARCHAR(100) NOT NULL COMMENT '资金来源',amount DECIMAL(10, 2) NOT NULL COMMENT '资金金额',FOREIGN KEY (project_id) REFERENCES Projects(project_id)
);CREATE TABLE Achievements (achievement_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '成果ID',project_id INT NOT NULL COMMENT '项目ID',achievement_name VARCHAR(100) NOT NULL COMMENT '成果名称',achievement_type ENUM('论文', '专利', '获奖', '其他') NOT NULL COMMENT '成果类型',description TEXT COMMENT '成果描述',FOREIGN KEY (project_id) REFERENCES Projects(project_id)
);CREATE TABLE ProjectLogs (log_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',project_id INT NOT NULL COMMENT '项目ID',user_id INT NOT NULL COMMENT '用户ID',log_date DATETIME NOT NULL COMMENT '日志日期',log_content TEXT NOT NULL COMMENT '日志内容',FOREIGN KEY (project_id) REFERENCES Projects(project_id),FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

DML

INSERT INTO Roles (role_name) VALUES
('管理员'),
('项目负责人'),
('项目成员');
INSERT INTO Users (username, password, gender, email) VALUES
('诸葛亮', '123', '男', 'zhugeliang@example.com'),
('孙悟空', '123', '男', 'sunwukong@example.com'),
('林黛玉', '123', '女', 'lindaiyu@example.com');
INSERT INTO UserRoles (user_id, role_id) VALUES
(1, 1), -- 诸葛亮是管理员
(2, 2), -- 孙悟空是项目负责人
(2, 3), -- 孙悟空也是项目成员
(3, 3);  -- 林黛玉是项目成员
INSERT INTO Projects (project_name, project_description, principal_investigator_id, start_date, end_date, status) VALUES
('三国历史研究项目', '研究三国历史背景', 1, '2023-01-01', '2023-12-31', '执行中'),
('西游记文化研究', '探究西游记的文学价值', 2, '2023-02-01', '2024-01-31', '申请中'),
('红楼梦解读', '分析红楼梦的深层含义', 2, '2023-03-01', '2023-11-30', '审批中');
INSERT INTO Funds (project_id, source, amount) VALUES
(1, '国家社会科学基金', 50000.00),
(2, '企业赞助', 30000.00),
(3, '学校科研基金', 45000.00),
(1, '地方政府资助', 20000.00); -- 同一个项目可以有多个经费来源
INSERT INTO Achievements (project_id, achievement_name, achievement_type, description) VALUES
(1, '三国历史研究报告', '论文', '详细分析了三国时期的历史事件'),
(2, '西游记文化解读', '论文', '深入探讨了西游记的文化内涵'),
(3, '红楼梦人物分析', '论文', '对红楼梦中的主要人物进行了深入剖析'),
(2, '西游记新发现', '专利', '发现了西游记中的新文学元素'); -- 同一个项目可以有多个成果
INSERT INTO ProjectLogs (project_id, user_id, log_date, log_content) VALUES
(1, 1, '2023-01-10 10:00:00', '项目启动会议召开'),
(2, 2, '2023-02-15 15:30:00', '提交项目申请书至学院'),
(3, 3, '2023-03-20 09:45:00', '开始收集红楼梦相关资料'),
(1, 1, '2023-04-01 14:15:00', '第一阶段研究成果汇报');

ER图 

 ER图

 模型图

简单查询

一、查询用户信息,仅显示用户的姓名与项目名称,用中文显示列名

SELECT DISTINCTu.username AS 用户名,p.project_name AS 项目名称
FROMUsers u
JOINProjects p ON u.user_id = p.principal_investigator_id;

二、根据项目名称进行模糊查询,模糊查询要进行索引,需要给出explain语句

EXPLAIN SELECT project_id, project_name
FROM Projects
WHERE project_name LIKE '%三国%';

三、统计用户的项目信息,查询所有用户的项目数量,并进行倒序排列

SELECT u.username AS 用户名,COUNT(p.project_id) AS 项目数量
FROM Users u
LEFT JOIN Projects p ON u.user_id = p.principal_investigator_id
GROUP BY u.user_id, u.username
ORDER BY 项目数量 DESC;

复杂查询

一、查询用户的基本信息,项目信息

SELECT u.user_id,u.username,u.gender,u.email,p.project_id,p.project_name,p.project_description,p.start_date,p.end_date,p.status
FROM Users u
LEFT JOIN Projects p ON u.user_id = p.principal_investigator_id;

二、查看项目中项目阶段最多的项目对应的类型

SELECT p.project_name,p.status
FROM Projects p
WHERE (SELECT COUNT(*) FROM Projects p2 WHERE p2.status = p.status) = (SELECT MAX(cnt) FROM (SELECT status, COUNT(*) as cnt FROM Projects GROUP BY status) as subquery);

三、查询项目最多的用户,并且查询用户的全部信息与当前项目阶段

SET @MostProjectsUserId = (SELECT principal_investigator_idFROM ProjectsGROUP BY principal_investigator_idORDER BY COUNT(*) DESCLIMIT 1
);SELECT u.*,p.project_id,p.project_name,p.status AS current_project_status
FROM Users u
JOIN Projects p ON u.user_id = p.principal_investigator_id
WHERE u.user_id = @MostProjectsUserId;

触发器

触发器一:项目状态更新时记录日志

DELIMITER $$
CREATE TRIGGER trg_after_project_status_update
AFTER UPDATE ON Projects
FOR EACH ROW
BEGINIF NEW.status <> OLD.status THENINSERT INTO ProjectLogs (project_id, user_id, log_date, log_content)VALUES (NEW.project_id, @CURRENT_USER_ID, NOW(), '项目状态已更新');END IF;
END;
$$
DELIMITER ;

触发器二:用户角色变更时记录日志

DELIMITER $$
CREATE TRIGGER trg_after_fund_insert
AFTER INSERT ON Funds
FOR EACH ROW
BEGININSERT INTO ProjectLogs (project_id, user_id, log_date, log_content)VALUES (NEW.project_id, @CURRENT_USER_ID, NOW(), CONCAT('项目获得资金:', NEW.source, ',金额为:', NEW.amount));
END;
$$
DELIMITER ;

触发器三:用户角色变更时记录日志

CREATE TABLE UserRoleLogs (log_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',user_id INT NOT NULL COMMENT '用户ID',old_role_id INT COMMENT '旧角色ID',new_role_id INT COMMENT '新角色ID',log_date DATETIME NOT NULL COMMENT '日志日期',log_content TEXT COMMENT '日志内容',FOREIGN KEY (user_id) REFERENCES Users(user_id),FOREIGN KEY (old_role_id) REFERENCES Roles(role_id),FOREIGN KEY (new_role_id) REFERENCES Roles(role_id)
);DELIMITER $$
CREATE TRIGGER trg_after_user_role_change
AFTER INSERT ON UserRoles
FOR EACH ROW
BEGINDECLARE old_role_name VARCHAR(50);DECLARE new_role_name VARCHAR(50);SELECT role_name INTO new_role_name FROM Roles WHERE role_id = NEW.role_id;IF new_role_name IS NOT NULL THENINSERT INTO UserRoleLogs (user_id, new_role_id, log_date, log_content)VALUES (NEW.user_id, NEW.role_id, NOW(), CONCAT('用户', NEW.user_id, '被赋予了新角色:', new_role_name));END IF;
END;
$$
DELIMITER ;

存储过程 

存储过程 1: 分配用户角色

DELIMITER $$
CREATE PROCEDURE AssignUserRole(IN userId INT, IN roleName VARCHAR(50))
BEGINDECLARE roleId INT;DECLARE CONTINUE HANDLER FOR NOT FOUND SET @errorMsg = 'Role not found.';SELECT role_id INTO roleId FROM Roles WHERE role_name = roleName;IF roleId IS NULL THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @errorMsg;END IF;IF NOT EXISTS (SELECT 1 FROM UserRoles WHERE user_id = userId AND role_id = roleId) THENINSERT INTO UserRoles (user_id, role_id) VALUES (userId, roleId);END IF;SELECT 'Role assigned successfully.' AS message;
END $$
DELIMITER ;

存储过程 2: 更新项目状态并记录日志

DELIMITER $$
CREATE PROCEDURE UpdateProjectStatus(IN projectId INT, IN newStatus ENUM('申请中', '审批中', '执行中', '结题'))
BEGINDECLARE OLD_STATUS ENUM('申请中', '审批中', '执行中', '结题');SELECT status INTO OLD_STATUS FROM Projects WHERE project_id = projectId;UPDATE Projects SET status = newStatus WHERE project_id = projectId;INSERT INTO ProjectLogs (project_id, user_id, log_date, log_content)VALUES (projectId, USER(), NOW(), CONCAT('Project status changed from ', OLD_STATUS, ' to ', newStatus));SELECT 'Project status updated successfully.' AS message;
END $$
DELIMITER ;

存储过程 3: 分配项目资金并检查预算

ALTER TABLE Projects ADD total_budget DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '项目总预算';
DELIMITER $$
CREATE PROCEDURE AllocateProjectFunds(IN p_project_id INT,IN p_source VARCHAR(100),IN p_amount DECIMAL(10, 2)
)
BEGINDECLARE v_total_budget DECIMAL(10, 2);DECLARE v_allocated_funds DECIMAL(10, 2);SELECT total_budget INTO v_total_budget FROM Projects WHERE project_id = p_project_id;SELECT SUM(amount) INTO v_allocated_funds FROM Funds WHERE project_id = p_project_id;IF v_total_budget >= (v_allocated_funds + p_amount) THENINSERT INTO Funds (project_id, source, amount) VALUES (p_project_id, p_source, p_amount);INSERT INTO ProjectLogs (project_id, user_id, log_date, log_content)VALUES (p_project_id, USER(), NOW(),CONCAT('资金已成功分配给项目', p_project_id, ',金额:', p_amount, ',来源:', p_source));SELECT '资金分配成功' AS message;ELSESELECT '预算不足,无法分配资金' AS message;END IF;
END $$
DELIMITER ;

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

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

相关文章

字节码编程ASM之idea插件asm bytecode outline的使用

写在前面 直接用ASM来编写字节码程序难度其实还是蛮大的&#xff0c;为此&#xff0c;就有热心人事开发了相关的idea插件 &#xff0c;其中比较优秀的一个是asm bytecode outline,本文就来一起看下如何使用。 1&#xff1a;安装 file->setting->plugins,搜索asm bytec…

gin-vue-amdin 新增路由

1&#xff1a;在api目录的example 下新建controller 层如下图&#xff08;&#xff09;&#xff1a; 在enter.go 中 加入 这个新建的结构体&#xff1a; 2&#xff1a;在router 的example 文件夹下 新建对应的路由文件 3&#xff1a;在initlize 的router 中 添加对应的代码&a…

PDF处理篇:有哪些免费的PDF注释工具

PDF 是一种功能强大的格式&#xff0c;广泛用于处理和传输数据。您可以创建自己的 PDF 文件&#xff0c;也可以使用其他人创建的 PDF 文件。但是&#xff0c;有时您想在 PDF 文件中包含其他文本、图形和其他元素。这就是 PDF 注释器为您提供帮助的地方。 有许多可用的 PDF 注释…

无线领夹麦克风品牌排名,揭秘哪种领夹麦性价比高!

在直播电商和Vlog的热潮推动下&#xff0c;自媒体内容创作迎来了前所未有的繁荣。麦克风行业也因应这一趋势&#xff0c;迎来了快速的增长期。特别是无线领夹麦克风&#xff0c;以其便携性和高效的录音能力&#xff0c;迅速成为视频制作者的新宠。它不仅在直播带货和短视频制作…

allure安装教程

1、下载 allure的官网下载地址&#xff1a; https://github.com/allure-framework/allure2/releases 注意&#xff1a;官网时常访问失败&#xff0c;可以访问以下网址&#xff1a; https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 选择一个版本&…

Uniapp的使用

为什么要使用uniapp uniapp 可以进行多端开发&#xff0c;uniapp 在设计的时候就拥有许多兼容性代码&#xff0c;可以兼容很多的平台 如 支付宝小程序 html页面 微信小程序等&#xff0c;注重开发效率而不是运行效率时 &#xff0c;就可以考虑一下 uniapp 当然也可以去…

ABAP ALV报表性能优化 经验总结

优化ALV报表&#xff0c;最主要就是优化取数逻辑和数据库查询。因为几乎在所有的程序中都会用到数据库查询&#xff0c;所以这篇文章的内容也不仅局限于SAP、ABAP程序&#xff0c;虽然ABAP有其特殊之处。 优化的时候我遵从以下几个原则&#xff1a; 1.把数据库连接视为一种极其…

Vivo手机怎么录屏?分享2种录屏方法

“新换的Vivo手机还挺好用的&#xff0c;但是今天看到一个视频想录下来保存&#xff0c;但找不到录屏功能啊&#xff0c;想问问大家Vivo手机的录屏功能怎么打开啊&#xff1f;还有Vivo手机能不能录制出高质量的视频呢&#xff1f;” 随着智能手机的普及&#xff0c;录屏功能已…

ChatTTS源码部署

感谢阅读 默认已完成的操作准备工作下载源码安装依赖下载补丁(报错在运行) 界面展示(discord上有各种补丁&#xff0c;我的加了UI补丁和音色增强)提示词常用&#xff08;这个每个音基本都能生效&#xff09;语调类语速类情感类 默认已完成的操作 python版本>3.9 cuda版本的…

《化工管理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《化工管理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《化工管理》级别&#xff1f; 答&#xff1a;国家级。主办单位&#xff1a;中国石油和化学工业联合会 主管单位&…

国产操作系统上配置ssh互信 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上配置ssh互信 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产桌面操作系统上配置SSH互信的文章。SSH&#xff08;Secure Shell&#xff09;是一种安全协议&#xff0c;用于在不安全的网络上安全地…

uniapp app分享页面到微信的功能方法

最近开发uniapp app项目时&#xff0c;有分享页面的功能需求&#xff0c;因此&#xff0c;给大家分享一下&#xff0c;在uniapp环境里&#xff0c;是如何分享页面到微信H5页面的。 如上图所示&#xff1a;app主体代码就是这样了&#xff0c;查看相应配置就可以&#xff0c;同时…

Swoole v6 能否让 PHP 再次伟大?

大家好&#xff0c;我是码农先森。 现状 传统的 PHP-FPM 也是多进程模型的的运行方式&#xff0c;但每个进程只能处理完当前请求&#xff0c;才能接收下一个请求。而且对于 PHP 脚本来说&#xff0c;只是接收请求和响应请求&#xff0c;并不参与网络通信。对数据库资源的操作…

Android (已解决)Execution failed for task ‘:app:lint‘

文章目录 一、错误原因二、解决方法 一、错误原因 这个错误信息表示在执行 Lint 检查时发现了错误&#xff0c;导致构建过程被中断。Lint 是一个用于检测 Android 项目中潜在问题的工具&#xff0c;比如性能、安全性、可用性等方面的问题。当Lint检查到严重错误时&#xff0c;…

“北京到底有谁在啊”影视APP开发,解锁最简单的快乐

随着电视剧《玫瑰的故事》在腾讯视频APP热播&#xff0c;APP也增加了很多热度&#xff0c;一款丰富的影视APP&#xff0c;无论是热门大片、经典影视剧、还是最新综艺节目&#xff0c;能畅享无限精彩的影视内容&#xff01; 开发影视APP&#xff0c;需要专业的技术服务商来解决…

1500平方米气膜羽毛球馆的造价分析—轻空间

随着全民健身热潮的兴起&#xff0c;气膜羽毛球馆因其良好的空气质量、恒温恒湿的环境和快捷的建设速度&#xff0c;受到了越来越多人的欢迎。建造一个1500平方米的气膜羽毛球馆涉及多个方面的费用&#xff0c;包括场地准备、设备材料、安装施工、配套设施等。轻空间将详细分析…

AutoEncoder简介

1.介绍 作为一种无监督或者自监督算法&#xff0c;自编码器本质上是一种数据压缩算法。 编码器&#xff1a; 输入图像&#xff08;在这个例子中是一个28x28像素的数字“9”&#xff09;首先被输入到编码器中。编码器的任务是将这个输入压缩成一个更小的、密集的表示形式&…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

跌幅高达10.2分!32本Top,Elsevier旗下在检SSCI期刊(2024年6月影响因子更新版)

本周投稿推荐 SSCI • 1区&#xff0c;4.0-5.0&#xff08;无需返修&#xff0c;提交可录&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.1-0.5&…

【单片机毕业设计选题24031】-基于STM32的智能手环设计

系统功能: 使用12864OLED液晶屏显示当前的步数&#xff0c;温度值&#xff0c;心率和报警值&#xff0c;单位是心率/分钟设置步长&#xff0c;测量里程&#xff1b;可以设置温度心率的上下限报警值&#xff0c;设置、加、减&#xff1b;用红外传感器XL01实现心率的测量&#x…