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

目录

  • 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))
    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('广告部');
    

    在这里插入图片描述

  2. 创建存储过程,将某部门的员工工资按工作年限进行调整,工作年限<3,提高 %53<=工作年限<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.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
    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;
    

    在这里插入图片描述

  2. 创建触发器,当在 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;
    

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

  3. 创建触发器,当在 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(实战项目1)】(1)图书借阅系统

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

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

相关文章

前端js调试如何复制console.log打印的对象或数组

在使用console.log()打印我们的内容时&#xff0c;时常需要将打印的内容复制粘贴使用&#xff0c;然而控制台打印出来的对象是经过格式化处理且直接选择粘贴会有格式问题&#xff0c;此时我们可以通过控制台的 copy() 方法来进行打印结果的复制&#xff0c;如图所示&#xff1a…

使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件

文件夹目录如下&#xff08;需要递归删除文件夹下的.DS_Store文件&#xff09;&#xff1a; labels文件夹下面是xml文件&#xff1a; import os import os.pathpath "name/labels" files os.listdir(path) # 得到文件夹下所有文件名称 s []for xmlFile in files:…

华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

【轻松玩转MacOS】指引篇:这9篇指南助你轻松上手

引言 亲爱的读者&#xff0c;欢迎来到《轻松玩转MacOS》&#xff01;这里是专为MacOS新手打造的使用教学专栏&#xff0c;无论您是从Windows转投Mac的初学者&#xff0c;还是对MacOS操作略知一二但希望更进一步的朋友&#xff0c;都能在这里找到您需要的答案。 正文 1、基本…

QT作业二

1、思维导图 https://www.zhixi.com/view/9e899ee0 2、作业 #include <iostream>using namespace std;class Rect {int width;int height; public:void init(int w,int h);//初始化函数void set_w(int w);//更改宽度void set_h(int h);//更改高度void show();//输出矩形…

你真的懂Java的继承吗?你知道什么时候用继承吗?设计继承是为了什么?

目录 1. 封装的意义是什么&#xff1f; 2. 为什么需要继承&#xff1f; 3. 继承是什么&#xff1f;如何使用&#xff1f; 4. 继承的好处是什么&#xff1f; 5. 设计继承需要注意什么&#xff1f; 6. 继承的特点 7. 子类到底继承了父类的哪些内容 7.1 继承内容 7.2 虚方…

【WSN】模拟无线传感器网络研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

html 笔记:CSS

1 什么是CSS CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素样式通常存储在样式表中 1.1 css的语法格式 1.1.1 选择器种类 HTML选择器&#xff1a; 重新定义HTML的某种标签的显示格式id选择器 对于HTML文档中的某个标签&#xff0c;定义它的显示格式…

JavaScript进阶(二十三):立即执行函数(匿名函数)( ( ) { } ( ) )含义解析

文章目录 一、前言二、立即执行函数2.1 立即执行函数使用的场景 三、拓展阅读 一、前言 前端项目改造过程中&#xff0c;引入的工具类实现如下&#xff1a; var tensquared(function(x) {return x*x; }(10)); 拆解以上语句如下&#xff1a; var tensquared xx; 这是赋值语句…

HTML5+CSS3+移动web 前端开发入门笔记(二)HTML标签详解

HTML标签&#xff1a;排版标签 排版标签用于对网页内容进行布局和样式的调整。下面是对常见排版标签的详细介绍&#xff1a; <h1>: 定义一级标题&#xff0c;通常用于标题栏或页面主要内容的标题。<p>: 定义段落&#xff0c;用于将文字分段展示&#xff0c;段落之…

Jmeter 链接MySQL测试

1.环境部署 1.1官网下载MySQL Connector https://dev.mysql.com/downloads/connector/j/ 1.2 解压后&#xff0c;将jar放到jmeter/lib目录下 1.3 在测试计划中添加引用 2.脚本设置 2.1设置JDBC Connection Configuration 先添加一个setUp线程中&#xff0c;在setUp中添加“…

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba

前言&#xff1a;当时比赛没有做出来现在来复现一下 就当记录一下&#xff08;这个思路没想到&#xff09; Black Mamba&#xff1a; 一张图片 常规得分离&#xff0c;属性&#xff0c;LSB&#xff0c;盲水印等都尝试过 无果&#xff01; 考点&#xff1a;异或解密&#xff0…

计算机算法分析与设计(8)---图像压缩动态规划算法(含C++代码)

文章目录 一、知识概述1.1 问题描述1.2 算法思想1.3 算法设计1.4 例题分析 二、代码 一、知识概述 1.1 问题描述 1. 一幅图像的由很多个像素点构成&#xff0c;像素点越多分辨率越高&#xff0c;像素的灰度值范围为0~255&#xff0c;也就是需要8bit来存储一个像素的灰度值信息…

【每日一练】勾股定理困难版

目录 题目官方给的解题思路源代码附最大公因数辗转相除法更相减损术 所有因数参考文献 题目 给定斜边z的值&#xff0c;求所有直角边x和y的组合数&#xff08;x、y和z都是正整数&#xff09;。 仅有一行输入&#xff0c;即斜边z的值&#xff08;z是正整数&#xff0c;且z<1…

nginx配置实例-负载均衡

1 实现效果&#xff1a; 浏览器访问nginx&#xff0c;输入访问nginx地址&#xff0c;然后负载均衡到tomcat8080和8002端口中 2 准备工作&#xff1a; 1&#xff09;准备两台tomcat容器&#xff0c;一台8080&#xff0c;一台8081 2&#xff09;在两台tomcat里面的webapps目录…

提升企业管理效率!金蝶软件配置自定义域名,快速实现公网远程访问

文章目录 前言1. 保留自定义域名2. 域名解析3. 配置自定义域名4. 关于服务器选择以及域名备案的说明4.1 关于服务器地区的选择&#xff1a;4.2 关于自定义域名备案&#xff1a;4.3 关于域名过白名单&#xff1a; 前言 上篇文章我们讲过如何安装金蝶云星空&#xff0c;实现异地…

云计算引领数字化时代

一、云计算的定义和演进 云计算是一种通过互联网将计算资源&#xff08;例如存储、处理能力和软件等&#xff09;提供给用户的方式。这种分布式的计算模式&#xff0c;使得用户无需购买昂贵的硬件设备&#xff0c;也不需要关注底层的技术细节&#xff0c;只需通过互联网就能获…

wpf webBrowser控件 常用的函数和内存泄漏问题

介绍 WebBrowsers可以让我们在窗体中进行导航网页。 WebBrowser控件内部使用ie的引擎&#xff0c;因此使用WebBrowser我们必须安装ie浏览器&#xff08;windows默认安装的&#xff09;。 使用 直接在xmal中使用webBrowser控件 <WebBrowser x:Name"WebBrowser1"…

【C++】List -- 详解

一、list的介绍及使用 https://cplusplus.com/reference/list/list/?kwlist list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&…

PCA和SVD数据降维

PCA&#xff08;Principal Component Analysis&#xff09; 是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;可用于提取数据的主要特征分量。 最大可分性 基向量乘原始矩阵会将矩阵映射到这个基向量空间中&#xff0c;如果基的数量少于向量本身的维数…