MySQL基础--08---流程控制( IF 、CASE) 和 游标

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 流程控制
        • 注意:只能用于存储程序。
    • 1 分支结构之 IF
      • 案例
    • 2 分支结构之 CASE
      • 案例
    • 3 循环结构之LOOP
      • 案例
    • 4 循环结构之WHILE
      • 案例
    • 5 循环结构之REPEAT
      • 案例
      • 对比三种循环结构:
    • 6 跳转语句之LEAVE语句
      • 案例
    • 7 跳转语句之ITERATE语句
      • 案例![在这里插入图片描述](https://img-blog.csdnimg.cn/5702bffdf05049cab17f4cd554ee4b5c.png)
  • 游标
    • 1 什么是游标(或光标)
    • 2 使用游标步骤
    • 3 举例
    • 5 小结


流程控制

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第1张图片
针对于MySQL 的流程控制语句主要有 3 类。

注意:只能用于存储程序。

  • 条件判断语句:IF 语句和 CASE 语句
  • 循环语句:LOOP、WHILE 和 REPEAT 语句
  • 跳转语句:ITERATE 和 LEAVE 语句

1 分支结构之 IF

IF 语句的语法结构是:
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第2张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第3张图片
举例2:声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第4张图片
举例3:声明存储过程“update_salary_by_eid2”,定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于9000元并且入职时间超过5年,就涨薪500元;否则就涨薪100元。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第5张图片
举例4:声明存储过程“update_salary_by_eid3”,定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于9000元,就更新薪资为9000元;薪资如果大于等于9000元且低于10000的,但是奖金
比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第6张图片

2 分支结构之 CASE

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第7张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第8张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第9张图片
举例3:声明存储过程“update_salary_by_eid4”,定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的,但是奖金比例
为NULL的,就更新奖金比例为0.01;其他的涨薪100元。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第10张图片
举例4:声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。判断该员工的
入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,
薪资涨300;如果是4年,薪资涨400;其他的涨薪500。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第11张图片

3 循环结构之LOOP

在这里插入图片描述
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第12张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第13张图片
举例2:当市场环境变好时,公司为了奖励大家,决定给大家涨工资。声明存储过程
“update_salary_loop()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家涨薪,薪资涨为原来的1.1倍。直到全公司的平均薪资达到12000结束。并统计循环次数。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第14张图片

4 循环结构之WHILE

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第15张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第16张图片
举例2:市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程
“update_salary_while()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家降薪,薪资降为原来的90%。直到全公司的平均薪资达到5000结束。并统计循环次数。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第17张图片

5 循环结构之REPEAT

在这里插入图片描述
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第18张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第19张图片
举例2:当市场环境变好时,公司为了奖励大家,决定给大家涨工资。声明存储过程
“update_salary_repeat()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家涨薪,薪资涨为原来的1.15倍。直到全公司的平均薪资达到13000结束。并统计循环次数。
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第20张图片

对比三种循环结构:

  1. 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
  2. LOOP:一般用于实现简单的"死"循环 WHILE:先判断后执行 REPEAT:先执行后判断,无条件 至少执行一次

6 跳转语句之LEAVE语句

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第21张图片

案例

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第22张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第23张图片

7 跳转语句之ITERATE语句

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第24张图片

案例MySQL基础--08---流程控制( IF 、CASE) 和 游标_第25张图片

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第26张图片

游标

1 什么是游标(或光标)

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第27张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第28张图片

2 使用游标步骤

游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。
如果我们想要使用游标,一般需要经历四个步骤。不同的 DBMS 中,使用游标的语法可能略有不同。
① 声明游标
② 打开游标
③ 使用游标(从游标中获取数据)
④ 关闭游标

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第29张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第30张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第31张图片
MySQL基础--08---流程控制( IF 、CASE) 和 游标_第32张图片

3 举例

创建存储过程“get_count_by_limit_total_salary()”,声明IN参数 limit_total_salary,DOUBLE类型;声明OUT参数total_count,INT类型。函数的功能可以实现累加薪资最高的几个员工的薪资值,直到薪资总和达到limit_total_salary参数的值,返回累加的人数给total_count。

DELIMITER //

CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT)
BEGIN

	#声明局部变量
	DECLARE sum_sal DOUBLE DEFAULT 0.0; #记录累加的工资总额
	DECLARE emp_sal DOUBLE; #记录每一个员工的工资
	DECLARE emp_count INT DEFAULT 0;#记录累加的人数
	
	
	#1.声明游标
	DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
	
	#2.打开游标
	OPEN emp_cursor;
	
	REPEAT
		
		#3.使用游标
		FETCH emp_cursor INTO emp_sal;
		
		SET sum_sal = sum_sal + emp_sal;
		SET emp_count = emp_count + 1;
		UNTIL sum_sal >= limit_total_salary
	END REPEAT;
	
	SET total_count = emp_count;
	
	#4.关闭游标
	CLOSE emp_cursor;
	
END //


DELIMITER ;

#调用
CALL get_count_by_limit_total_salary(200000,@total_count);
SELECT @total_count;

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第33张图片

5 小结

MySQL基础--08---流程控制( IF 、CASE) 和 游标_第34张图片

你可能感兴趣的:(MySQL,mysql,数据库,database)