【数据库——MySQL】(16)游标和触发器习题及讲解
目录
- 1. 题目
- 1.1 游标
- 1.2 触发器
- 2. 解答
- 2.1 游标
- 2.2 触发器
1. 题目
1.1 游标
-
创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)
-
创建存储过程,将某部门的员工工资按工作年限进行调整,
工作年限<3,提高 %5,3<=工作年限<5,提高 %10,工作年限>=5,提高 %15。
1.2 触发器
-
创建触发器,当在
employees表中插入一个员工信息时,如果员工的部门编号,department表中没有,则取消插入操作。 -
创建触发器,当在
employees表中删除一条记录时,在salary表中删掉该员工的记录。 -
创建触发器,当在
employees表中修改员工编号时,在salary表中同时修改员工编号。
2. 解答
2.1 游标
-
创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)
方法一:使用计数器来循环
drop PROCEDURE if EXISTS p1; delimiter $ create PROCEDURE p1(in dname char(20)) begindeclare employee_id char(6);declare employee_name char(10);declare employee_salary float;declare salary_count int; # 统计记录数declare i int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;select count(*) into salary_countfrom (select employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname)a;open c_salary; # 打开游标while i <= salary_count doFETCH c_salary into employee_id, employee_name, employee_salary; # 读取游标select employee_id, employee_name, employee_salary; # 使用游标set i = i + 1;end while;close c_salary; # 关闭游标end $ delimiter ;call p1('广告部');
方法二:使用控制循环
drop PROCEDURE if EXISTS p1; delimiter $ create PROCEDURE p1(in dname char(20)) begindeclare employee_id char(6);declare employee_name char(10);declare employee_salary float;declare f int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;# 错误处理declare exit handler for not foundset f = 0;open c_salary; # 打开游标while f = 1 doFETCH c_salary into employee_id, employee_name, employee_salary; # 读取游标select employee_id, employee_name, employee_salary; # 使用游标end while;close c_salary; # 关闭游标end $ delimiter ;call p1('广告部');
-
创建存储过程,将某部门的员工工资按工作年限进行调整,
工作年限<3,提高 %5,3<=工作年限<5,提高 %10,工作年限>=5,提高 %15。drop PROCEDURE if EXISTS p2; delimiter $ create PROCEDURE p2(in dname char(20)) begindeclare employee_id char(6);declare employee_WorkYear TINYINT;declare add_income float;declare f int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.WorkYearfrom employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;# 错误处理declare exit handler for not foundset f = 0;open c_salary; # 打开游标while f = 1 doFETCH c_salary into employee_id, employee_WorkYear; # 读取游标if employee_WorkYear < 3 then set add_income = 0.05;elseif employee_WorkYear < 5 thenset add_income = 0.1;elseset add_income = 0.15;end if;update salaryset Income = Income + Income * add_incomewhere salary.EmployeeID = employee_id;end while;close c_salary; # 关闭游标end $ delimiter ;call p2('广告部');
再次调用存储过程
p1查看广告部员工实际收入,从而验证存储过程p2是否正确。注:因为在存储过程
p2提高的是 收入,而不是 实际收入,即支出是不变的。所以p2的结果不是简单的通过p1的结果乘上相应提升率!
比如 伍容华 的支出是
88.03,那么存储过程p2的结果是这么来的:( 1494.59 + 88.03 ) ∗ ( 1 + 0.1 ) = 1740.882 (1494.59+88.03) * (1+0.1) = 1740.882 (1494.59+88.03)∗(1+0.1)=1740.882
1740.88 − 88.03 = 1652.85 1740.88 - 88.03 = 1652.85 1740.88−88.03=1652.85
2.2 触发器
-
创建触发器,当在
employees表中插入一个员工信息时,如果员工的部门编号,department表中没有,则取消插入操作。drop trigger if EXISTS tri_insertinfo; delimiter $ create TRIGGER tri_insertinfo before insert on employees for each row begindeclare a int;select count(*) into afrom departmentswhere departments.DepartmentID = new.DepartmentID;if a = 0 then SIGNAL SQLSTATE '12345' set message_text = '部门不存在';end if;end$ delimiter ;select * from employees;
select * from departments;
insert into employees values('999996', '小邓在森林', '本科', '2022-02-17', '1', 5, '武汉大学', '00000000', '6');
insert into employees values('999995', '小邓在森林', '本科', '2022-02-17', '1', 5, '武汉大学', '00000000', '10');
select * from employees;
-
创建触发器,当在
employees表中删除一条记录时,在salary表中删掉该员工的记录。drop trigger if EXISTS tri_deleteinfo; delimiter $ create TRIGGER tri_deleteinfo after delete on employees for each row begindelete from salarywhere EmployeeID=old.EmployeeID;end$ delimiter ;delete from employees where EmployeeID = 999996; select * from employees; select * from salary;
注:因为没有在表
salary中插入 小邓在森林 的数据,我们再来试一下删除 伍容华 的数据。delete from employees where EmployeeID = 010008; select * from employees; select * from salary;
可以看见 伍容华 的数据已经被删除。 -
创建触发器,当在
employees表中修改员工编号时,在salary表中同时修改员工编号。drop trigger if EXISTS tri_updateinfo; delimiter $ create TRIGGER tri_updateinfo after update on employees for each row beginupdate salaryset EmployeeID = new.EmployeeIDwhere EmployeeID = old.EmployeeID; end$ delimiter ;我们修改 王林 的编号(将
000001修改为999999),原数据是:select * from employees; select * from salary;
修改后结果:
update employeesset EmployeeID = '999999'where employees.EmployeeID = '000001';select * from employees; select * from salary;
上一篇文章:【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解
相关文章:
【数据库——MySQL】(16)游标和触发器习题及讲解
目录 1. 题目1.1 游标1.2 触发器 2. 解答2.1 游标2.2 触发器 1. 题目 1.1 游标 创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现) 创建存储过程,将某部门的员工工资按工作…...
javascript二维数组(9)toString的用法
在JavaScript中,toString() 是一个内置方法,用于将特定的对象转化为字符串表示形式。 基本使用示例 以下是一些 toString() 方法的基本使用示例: 数字的 toString(): let num 123; console.log(num.toString()); // 输出: &…...
OpenAI重大更新!为ChatGPT推出语音和图像交互功能
原创 | 文 BFT机器人 OpenAI旗下的ChatGPT正在迎来一次重大更新,这个聊天机器人现在能够与用户进行语音对话,并且可以通过图像进行交互,将其功能推向与苹果的Siri等受欢迎的人工智能助手更接近的水平。这标志着生成式人工智能运动的一个显著…...
【开发篇】十六、SpringBoot整合JavaMail实现发邮件
文章目录 0、相关协议1、SpringBoot整合JavaMail2、发送简单邮件3、发送复杂邮件 0、相关协议 SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议POP3(Post Office Protocol - Versi…...
如何在Ubuntu系统部署RabbitMQ服务器并公网访问【内网穿透】
文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...
Flutter笔记:用于ORM的Floor框架简记
Flutter笔记 用于ORM的Floor框架简记 本文地址:https://blog.csdn.net/qq_28550263/article/details/133377191 floor 模块地址:https://pub.dev/packages/floor 【介绍】:最近想找用于Dart和Flutter的ORM框架,偶然间发现了Floor…...
Zabbix自定义脚本监控MySQL数据库
一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…...
【Spatial-Temporal Action Localization(五)】论文阅读2020年
文章目录 1. Actions as Moving Points摘要和结论引言:针对痛点和贡献模型框架实验 1. Actions as Moving Points Actions as Moving Points (ECCV 2020) 摘要和结论 MovingCenter Detector (MOCdetector) 通过将动作实例视为移动点的轨迹。通过三个分支生成 tub…...
Linux基本指令(中)——“Linux”
各位CSDN的uu们好呀,今天,小雅兰的内容是Linux基本指令呀!!!下面,让我们进入Linux的世界吧!!! cp指令(重要) mv指令(重要)…...
OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击
作者:gentle_zhou 原文链接:OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击-云社区-华为云 Web应用程序安全一直是一个重要的话题,它不但关系到网络用户的隐私,财产,而且关系着用户对程序的新…...
Java自定义类加载器的详解与步骤
自定义类加载器的步骤 继承ClassLoader类:首先创建一个新的类,该类需要继承ClassLoader类。可以通过直接继承ClassLoader或是间接继承URLClassLoader等子类来实现。重写findClass()方法:在自定义类加载器中,最重要的是重写findCl…...
完美清晰,炫酷畅享——Perfectly Clear Video为你带来卓越的AI视频增强体验
在我们日常生活中,我们经常会拍摄和观看各种视频内容,无论是旅行记录、家庭聚会还是商务演示,我们都希望能够呈现出最清晰、最精彩的画面效果。而现在,有一个强大的工具可以帮助我们实现这一目标,那就是Perfectly Clea…...
如何让FileBeat支持http的output插件
目录 1 缘由2 编译filebeat3 配置虚拟机访问外网4 编译beats-output-http4.1 使用本地包4.2 发布在线包 5 测试6 beats-output-http的部分解释 1 缘由 官网的filebeat只有以下几种output插件: Elasticsearch ServiceElasticsearchLogstashKafkaRedisFileConsole …...
解密人工智能:决策树 | 随机森林 | 朴素贝叶斯
文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、决策树2.1 优点2.2 缺点 三、随机森林四、Naive Bayes(朴素贝叶斯)五、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法,通过对…...
web:[极客大挑战 2019]BabySQL
题目 点进页面显示如下 查看源代码 先尝试一下万能密码 没用,or被过滤了 试着双写看看 回显一串,也不是flag 先查询列数尝试一下,把union select过滤了,使用双写 构造payload /check.php?usernameadmin&password1 %27 ununi…...
DRM全解析 —— plane详解(1)
本文参考以下博文: Linux内核4.14版本——drm框架分析(5)——plane分析 特此致谢! 1. 简介 一个plane代表一个image layer(硬件图层),最终的image由一个或者多个plane(s)组成。plane和 Framebuffer 一样是内存地址。…...
数据结构总结
数据结构 相关博文 单链表数组模拟单链表-CSDN博客双链表数组模拟双链表-CSDN博客栈及单调栈数组模拟栈以及单调栈-CSDN博客队列及单调队列数组模拟队列以及单调队列-CSDN博客KMPKMP详细算法思路-CSDN博客TrieTire树的理解-CSDN博客并查集并查集(面试常考ÿ…...
在SOLIDWORKS搭建一个简易的履带式机器人
文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期,在solidworks中搭建了一个履带式机器人小车,计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板(a面)…...
C# 为什么要限制静态方法的使用
前言 在工作了一年多之后,我发现静态方法的耦合问题实在是头疼。如果可以尽量不要使用静态方法存储数据,如果要存储全局数据就把数据放在最顶层的主函数里面。 静态方法问题 耦合问题,不要用静态方法存储数据 我这里有两个静态方法&#…...
【已解决】Pyecharts折线图,只有坐标轴没有折线数据
【已解决】Pyecharts折线图,只有坐标轴没有折线数据 1、问题复现2、原因3、问题解决 1、问题复现 在做简单的数据通过 Pyecharts 生成折现图的时候,一直只有坐标轴没有折线数据,但是代码一直看不出问题,代码如下: im…...
员工管理(新增员工)、事务管理和文件上传(阿里云OSS)
员工管理(新增员工) 思路就是就是新增的员工基本信息和批量保存员工的工作经历信息,也就是后端对应了两条sql语句, 1.保存员工基本信息 Emp实体类中新添一个字段用于保存员工工作经历 //封装工作经历 private List<EmpExpr> exprList; (1)Cont…...
TIA Portal 多版本下载与安装全攻略
1. TIA Portal版本选择与下载准备 第一次接触西门子TIA Portal的工程师,面对从V15.1到V18多个版本时,往往会陷入选择困难。我刚开始用TIA Portal时也踩过不少坑,后来发现版本选择主要取决于两个因素:项目需求和硬件兼容性。如果是…...
OpalServe:构建团队AI工具统一控制平面,实现MCP服务器集中治理
1. 项目概述:为团队AI工具构建统一控制平面如果你和你的团队正在使用Claude Desktop、Cursor、Windsurf这类支持MCP(Model Context Protocol)的AI编程工具,那么下面这个场景你一定不陌生:每个开发者都需要在自己的机器…...
Carla 启动卡在75%并报“Fatal error”:从崩溃日志到资源缺失的排查实录
1. 当Carla卡在75%:从崩溃现象到问题定位 那天我正在Windows环境下调试Carla仿真平台,编译过程一切顺利,但执行make launch命令后,进度条就像被施了定身咒——永远停在了75%的位置。紧接着弹出的"Fatal error"对话框让我…...
边缘AI落地实战:从软件平台到NPU硬件的协同开发路径
1. 边缘AI的现实挑战与破局思路在2025年的阿姆斯特丹,一场汇聚了半导体巨头与初创公司的会议,清晰地勾勒出当前技术领域最炙手可热的战场:边缘人工智能。这不再是实验室里的概念演示,而是工程师们每天都要面对的真实难题——如何让…...
Avogadro 2:开源分子可视化库的终极技术解析
Avogadro 2:开源分子可视化库的终极技术解析 【免费下载链接】avogadrolibs Avogadro libraries provide 3D rendering, visualization, analysis and data processing useful in computational chemistry, molecular modeling, bioinformatics, materials science,…...
手把手教你用Python/Node.js快速接入抖音开放平台,实现用户信息获取
Python/Node.js实战:抖音开放平台用户信息获取全流程解析 抖音开放平台为开发者提供了丰富的用户数据接口,但很多技术团队在对接过程中常因OAuth2.0流程复杂而卡在授权环节。本文将用两种主流技术栈演示如何快速完成从授权到获取用户信息的完整闭环。 1.…...
PowerBI主题模板终极指南:35款可视化模板快速美化报表
PowerBI主题模板终极指南:35款可视化模板快速美化报表 【免费下载链接】PowerBI-ThemeTemplates Snippets for assembling Power BI Themes 项目地址: https://gitcode.com/gh_mirrors/po/PowerBI-ThemeTemplates 还在为PowerBI报表的单调外观而烦恼吗&#…...
Attu:向量数据库可视化管理工具的终极指南
Attu:向量数据库可视化管理工具的终极指南 【免费下载链接】attu The Best GUI for Milvus 项目地址: https://gitcode.com/gh_mirrors/at/attu 还在为复杂的向量数据库命令行操作而烦恼吗?Attu作为Milvus向量数据库的官方图形化管理工具…...
告别盲调!用STM32CubeMonitor实时可视化你的MCU变量(附Windows/Mac安装包)
告别盲调!用STM32CubeMonitor实时可视化你的MCU变量(附Windows/Mac安装包) 调试嵌入式系统时,最令人抓狂的莫过于反复修改代码、下载、断点查看变量——这种"盲人摸象"式的开发方式,在调试动态系统ÿ…...
