【数据库——MySQL】(16)游标和触发器习题及讲解

news2024/11/17 15:27:27

目录

  • 1. 题目
    • 1.1 游标
    • 1.2 触发器
  • 2. 解答
    • 2.1 游标
    • 2.2 触发器

1. 题目

1.1 游标

  1. 创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)

  2. 创建存储过程,将某部门的员工工资按工作年限进行调整,工作年限<3,提高 %53<=工作年限<5,提高 %10工作年限>=5,提高 %15

1.2 触发器

  1. 创建触发器,当在 employees 表中插入一个员工信息时,如果员工的部门编号,department 表中没有,则取消插入操作。

  2. 创建触发器,当在 employees 表中删除一条记录时,在 salary 表中删掉该员工的记录。

  3. 创建触发器,当在 employees 表中修改员工编号时,在 salary 表中同时修改员工编号。

2. 解答

2.1 游标

  1. 创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)

    方法一:使用计数器来循环

    drop PROCEDURE if EXISTS p1;
    delimiter $
    create PROCEDURE p1(in dname char(20))
    begin
    	declare 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 for
    		select employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'
    		from employees join departments on employees.DepartmentID = departments.DepartmentID
    									 join salary on employees.EmployeeID = salary.EmployeeID
    		where departments.DepartmentName = dname;
    	
    	select count(*) into salary_count
    	from (
    		select employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'
    		from employees join departments on employees.DepartmentID = departments.DepartmentID
    									 join salary on employees.EmployeeID = salary.EmployeeID
    		where departments.DepartmentName = dname)a;
    	
    	open c_salary;    # 打开游标
    	
    	while i <= salary_count do
    		FETCH 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))
    begin
    	declare employee_id char(6);
    	declare employee_name char(10);
    	declare employee_salary float;
    	declare f int default 1;
    	# 设置游标
    	declare c_salary CURSOR for
    		select employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'
    		from employees join departments on employees.DepartmentID = departments.DepartmentID
    									 join salary on employees.EmployeeID = salary.EmployeeID
    		where departments.DepartmentName = dname;
    	
    	# 错误处理
    	declare exit handler for not found
    		set f = 0;
    	
    	open c_salary;    # 打开游标
    	
    	while f = 1 do
    		FETCH 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('广告部');
    

    在这里插入图片描述

  2. 创建存储过程,将某部门的员工工资按工作年限进行调整,工作年限<3,提高 %53<=工作年限<5,提高 %10工作年限>=5,提高 %15

    drop PROCEDURE if EXISTS p2;
    delimiter $
    create PROCEDURE p2(in dname char(20))
    begin
    	declare employee_id char(6);
    	declare employee_WorkYear TINYINT;
    	declare add_income float;
    	declare f int default 1;
    	# 设置游标
    	declare c_salary CURSOR for
    		select employees.EmployeeID, employees.WorkYear
    		from employees join departments on employees.DepartmentID = departments.DepartmentID
    									 join salary on employees.EmployeeID = salary.EmployeeID
    		where departments.DepartmentName = dname;
    	
    	# 错误处理
    	declare exit handler for not found
    		set f = 0;
    	
    	open c_salary;    # 打开游标
    	
    	while f = 1 do
    		FETCH c_salary into employee_id, employee_WorkYear;		# 读取游标
    		
    		if employee_WorkYear < 3 then 
    			set add_income = 0.05;
    		elseif employee_WorkYear < 5 then
    			set add_income = 0.1;
    		else
    			set add_income = 0.15;
    		end if;
    		
    		update salary
    			set Income = Income + Income * add_income
    		where 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.8888.03=1652.85

2.2 触发器

  1. 创建触发器,当在 employees 表中插入一个员工信息时,如果员工的部门编号,department 表中没有,则取消插入操作。

    drop trigger if EXISTS tri_insertinfo;
    delimiter $
    create TRIGGER tri_insertinfo before insert on employees for each row
    begin
    	declare a int;
    	select count(*) into a
    	from departments
    	where 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;
    

    在这里插入图片描述

  2. 创建触发器,当在 employees 表中删除一条记录时,在 salary 表中删掉该员工的记录。

    drop trigger if EXISTS tri_deleteinfo;
    delimiter $
    create TRIGGER tri_deleteinfo after delete on employees for each row
    begin
    	delete from salary
    		where 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;
    

    在这里插入图片描述
    可以看见 伍容华 的数据已经被删除。

  3. 创建触发器,当在 employees 表中修改员工编号时,在 salary 表中同时修改员工编号。

    drop trigger if EXISTS tri_updateinfo;
    delimiter $
    create TRIGGER tri_updateinfo after update on employees for each row
    begin
    	update salary
    		set EmployeeID = new.EmployeeID
    	where EmployeeID = old.EmployeeID;
    end$
    delimiter ;
    

    我们修改 王林 的编号(将 000001 修改为 999999),原数据是:

    select * from employees;
    select * from salary;
    

    在这里插入图片描述

    修改后结果:

    update employees
    	set EmployeeID = '999999'
    	where employees.EmployeeID = '000001';
    
    select * from employees;
    select * from salary;
    

    在这里插入图片描述

上一篇文章:【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

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

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

相关文章

Pr音乐鼓点节拍插件BeatEdit出现不能标点问题如何解决?

BeatEdit是一款专业的PR卡点自动剪辑插件工具。BeatEdit最新版内置采集、剪辑、调色、美化音频、字幕添加、输出、DVD刻录等功能&#xff0c;还支持检测音乐节拍、生成时间线标记等操作。通过BeatEdit版软件用户只需选择素材就可以自己剪辑&#xff0c;多用于进行鬼畜视频制作。…

MS31703H 桥栅极驱动控制器,可P2P替代TI的DRV8703

MS31703NA 是一款小型单通道 H 桥栅极驱动 器。它使用四个外部 N 通道 MOSFET &#xff0c;驱动一个双 向刷式直流电机。 PH/EN 、独立半桥或 PWM 允许轻松连接到控制 器电路。内部传感放大器提供可调的电流控制。集 成的电荷泵可提供 100% 占空比&#xff0c;而…

docker搭建Jenkins及基本使用

1. 搭建 查询镜像 docker search jenkins下载镜像 docker pull jenkins/jenkins启动容器 #创建文件夹 mkdir -p /home/jenkins_home #权限 chmod 777 /home/jenkins_home #启动Jenkins docker run -d -uroot -p 9095:8080 -p 50000:50000 --name jenkins -v /home/jenkins_home…

基于FPGA设计的低成本四通道 1GSPS 示波器设计资料

完整设计资料下载链接 https://download.csdn.net/download/tianqiquan/88253962 该项目的目标是设计和构建一个PC 连接替代方案&#xff0c;以替代低成本台式 1000 系列示波器&#xff0c;在性能和价格上都具有竞争力。该项目必须达到的规格是四个通道至少 100MHz&#xff0c…

Linux网络配置解析:连接世界的关键步骤

1.IP预备知识 IP最重要的信息包含&#xff1a;IP地址DNS网关 以下以IPV4为例说明&#xff1a; 11000000.10101000.00000000.00000001/24 192.168.0.1/24IP地址一般包含32位二进制地址和子网掩码 子网掩码全1位置对应的就是IP地址的网络号&#xff0c;全0位置对应的就是具体…

【Spatial-Temporal Action Localization(五)】论文阅读2020年

文章目录 1. Actions as Moving Points摘要和结论引言&#xff1a;针对痛点和贡献模型框架实验 1. Actions as Moving Points Actions as Moving Points (ECCV 2020) 摘要和结论 MovingCenter Detector (MOCdetector) 通过将动作实例视为移动点的轨迹。通过三个分支生成 tub…

混合表示人体的论文

0、致敬Xia Weihao 整理了数字人方面的重要论文和链接 网址如下&#xff1a; GitHub - weihaox/awesome-digital-human: A collection of resources on digital human including clothed people digitalization, virtual try-on, and other related directions.A collection …

继电器测试的应用场景和行业有哪些?

继电器是一种常见的电气元件&#xff0c;用于控制电路的开关和保护设备&#xff0c;它在许多行业和应用场景中发挥着重要的作用。继电器在电力系统中用于保护和控制电力设备&#xff0c;如发电机、变压器、电缆和线路。继电器测试可以确保继电器的准确性和可靠性&#xff0c;以…

起重机笔记 - 进阶篇(编辑中...)

1.双速葫芦 起重机在实际使用过程中&#xff0c;要兼顾效率和最大载重这两个因素&#xff0c;所以&#xff0c;起重机厂商会推出双速葫芦。双速葫芦的变速比&#xff0c;10吨的级别&#xff0c;最高可以达到1:10甚至更靠上。大功率的低速档用于提升高载荷负重&#xff0c;高速…

米小樽MiMe三店同开,应时手作的高品质米乳饮品新体验

米小樽MiMe于美丽的鹭岛厦门正式试营业。这一次的布局不可谓不大&#xff0c;三家门店&#xff1a;莲花北路、湾悦城、西堤&#xff0c;厦门三地同步开启&#xff0c;致力于为消费者带来崭新的健康饮品体验&#xff0c;开启潮流的「饮养」生活方式。 清新惬意的门店设计&#x…

【Overload游戏引擎分析】编辑器对象鼠标拾取原理

Overload的场景视图区有拾取鼠标功能&#xff0c;单击拾取物体后会显示在Inspector面板中。本文来分析鼠标拾取这个功能背后的原理。 一、OpenGL的FrameBuffer 实现鼠标拾取常用的方式有两种&#xff1a;渲染id到纹理、光线投射求交。Overload使用的是渲染id到纹理&#xff0c…

苹果商城(App Store)应用程序苹果ios签名进行系统怎么上架的注意事项完整教程

苹果商城&#xff08;App Store&#xff09;应用程序苹果ios签名进行系统怎么上架的注意事项完整教程 导语&#xff1a;苹果签名是保障安全和防止软件篡改的重要措施&#xff0c;也是苹果设备下载应用程序的必要步骤。本文将为大家提供一个详细的教程&#xff0c;介绍如何为应用…

机械臂运动控制,通讯的解包->运动控制->数据封包上报过程

一、协议 数据格式为小端模式&#xff0c;浮点数格式为IEEE754&#xff0c;需与上位机的PC端一致&#xff0c;如window系统&#xff0c;其它系统需要自行测试&#xff0c;用于传输16位、32位、float数据格式&#xff0c;避免只传输字节数据带来转换的繁琐及精度丢失。 二、下位…

软件四大开源生态系统的开源

Java (Maven)、JavaScript (npm)、Python (PyPI)、.NET (NuGet Gallery) 四大开源生态系统的开源应用&#xff1b; 开源项目的主动维护也变得越来越少。研究表明&#xff0c;去年有近五分之一&#xff08;18.6%&#xff09;的项目停止维护&#xff0c;影响了 Java 和 JavaScrip…

【科研工具】-论文相关

科研工具 1 论文检索2 论文阅读3 论文写作4 论文发表 1 论文检索 计算机类英文文献检索数据库DBLP: 只有论文基本信息&#xff08;标题、作者等&#xff09;&#xff1b;下载论文&#xff1a;知网\IEEE\ACM\SCI-Hub等&#xff0c;记得创建文件夹&#xff08;检索词条、日期等&…

Vue3最佳实践 第七章 TypeScript 创建Trello 任务管理器

| ​ 我们将探讨如何使用Vue.js从零开始创建一个类似于Trello的任务管理应用程序。如果你不熟悉Trello&#xff0c;它是一款非常流行的任务管理工具&#xff0c;允许你把任务写在卡片上&#xff0c;然后通过一个看板的方式来直观地管理这些任务。Trello不仅可以用于个人的任务…

报名通道开启 | 第六届“强网”拟态防御国际精英挑战赛强势来袭

第六届“强网”拟态防御国际精英挑战赛计划将于2023年11月下旬在南京震撼开幕。 本届比赛采用线上线下结合的形式&#xff0c;再次为全球顶尖战队提供实战机会&#xff0c;向多类拟态防御设备系统发起挑战。接受挑战的拟态防御设备系统基于邬江兴院士原创的网络空间内生安全理…

向量空间的封闭性

向量空间封闭&#xff0c;是指&#xff1a; - 两个向量相加所得的向量仍然在该向量空间中 - 实数和向量数乘所得的向量仍然在该向量空间中 即&#xff0c;假设为向量的集合&#xff1a; 如果&#xff0c;&#xff0c;那么如果&#xff0c;&#xff0c;那么

电梯安全监测丨S271W无线水浸传感器用于电梯机房/电梯基坑水浸监测

城市化进程中&#xff0c;电梯与我们的生活息息相关。高层住宅、医院、商场、学校、车站等各种商业体建筑、公共建筑中电梯为我们生活工作提供了诸多便利。 保障电梯系统的安全至关重要&#xff01;特别是电梯机房和电梯基坑可通过智能化改造提高其安全性和稳定性。例如在暴风…

电力行业首个自主可控的大模型发布了!百度飞桨、文心大模型提供支持

电力行业首个自主可控的大模型来了&#xff01;9月26日&#xff0c;南方电网人工智能科技有限公司负责研发的电力行业人工智能创新平台及自主可控电力大模型正式公开发布。 南方电网举办电力行业人工智能创新平台及自主可控电力大模型发布会 电力行业人工智能创新平台提供模型…