流程控 制

本文深入探讨了数据库中的四种循环结构——IF分支、CASE结构、WHILE循环和REPEAT循环,通过实例展示了它们在存储过程中的使用,如员工薪资调整等场景。同时,讲解了如何根据条件进行不同操作,以及如何控制循环直至满足特定条件为止。
摘要由CSDN通过智能技术生成


在这里插入图片描述

分支结构之IF

#分支结构IF的使用

#举例
DELIMITER //

CREATE PROCEDURE test_if()
BEGIN
				#情况1
				#声明局部变量
				#DECLARE stu_name VARCHAR(15);
				#IF stu_name IS NULL
				#THEN SELECT 'stu_name is null';
				#END IF;
				#情况2:二选一
				#DECLARE email VARCHAR(25);
				#IF email is NULL 
				#				THEN SELECT 'email is null';
				#ELSE 
				#				SELECT 'email is not null';
				#END IF ;
				#情况3:多选一
				DECLARE age INT DEFAULT 20;
				IF age > 40
				THEN SELECT '中老年';
				ELSEIF age >18
				THEN SELECT '青壮年';
				ELSEIF age > 8
				THEN SELECT '青少年';
				ELSE 
				SELECT '婴幼儿';
				END IF ;
				
				
END//

DELIMITER ;
#调用
CALL test_if();
	
DROP PROCEDURE test_if;

分支结构之CASE

#分支结构之CASE
DELIMITER //
CREATE PROCEDURE test_case()
BEGIN 
			#演示1:case ... when ...then...
			/*
			DECLARE var INT DEFAULT 2;
			CASE var
							WHEN 1 THEN SELECT 'var = 1';
							WHEN 2 THEN SELECT 'var = 2';
							WHEN 3 THEN SELECT 'var = 3';
							ELSE SELECT 'other value';
			
			END CASE;
			*/
			#演示2:case when...then....
			DECLARE var1 INT DEFAULT 10;
			CASE  
			WHEN var1>=100 then SELECT '三位数';
			WHEN var1>=10 THEN SELECT '两位数';
			ELSE SELECT '个位数';
			END CASE;
END //

DELIMITER ;

#调用
CALL test_case();

DROP PROCEDURE test_case;

#举例:声明存储过程“update_salary_by_eid4”,定义IN参数emp_id,输入员工编号。
#判断该员工薪资如果低于9000,就更新薪资为9000;薪资大于9000且低于10000的;
#但是奖金比例为null的,就更新奖金比例为0.01,其他的涨薪100;
DELIMITER //
CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT)
BEGIN 
			#声明局部变量
			DECLARE emp_sal DOUBLE;#记录员工工资
		
			DECLARE bonus DOUBLE;#记录奖金率
			
			#局部变量的赋值
			SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
			SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
			
			CASE
			WHEN emp_sal <9000 THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
			WHEN emp_sal < 10000 AND bonus IS NULL THEN UPDATE employees SET commission_pct = 0.01
																								 WHERE  employee_id = emp_id;
			ELSE UPDATE employees SET salary 	= salary +100 WHERE employee_id = emp_id;			
	
			END CASE;
																	 
END //


DELIMITER;
CALL update_salary_by_eid4(103);
CALL update_salary_by_eid4(104);
CALL update_salary_by_eid4(105);

SELECT * 
FROM employees
WHERE employee_id IN (103,104,105);

循环结构之LOOP

在这里插入图片描述

#循环结构之LOOP

#举例1:
DELIMITER //

CREATE PROCEDURE test_loop()
BEGIN
				#声明局部变量
				DECLARE num INT DEFAULT 1;
				
				loop_label:LOOP
									#重新赋值
									SET num= num+1;
									IF num >= 10 THEN LEAVE loop_label;
									END IF;
						END LOOP loop_label;
						#查看num
						SELECT num;
	
END //

DELIMITER ;

#调用
CALL test_loop();

#举例2:当市场环境变好时,公司为了奖励大家,决定给大家涨工资。
#声明存储过程"update_salary_loop()",声明OUT参数num,输出循环次数,存储过程中实现循环给大家涨薪,涨薪为原来的1.1倍,直到全公司的平均薪资
#达到12000结束,并统计循环次数

DELIMITER //

CREATE PROCEDURE update_salary_loop(OUT num INT)

BEGIN 
				#声明变量
				DECLARE avg_sal DOUBLE ;#记录员工的平均工资
				DECLARE loop_count INT DEFAULT 0;#记录循环次数
				
				#获取员工的平均工资
				SELECT AVG(salary) INTO avg_sal FROM employees;
				
				loop_lab:LOOP
								#结束循环条件
								IF avg_sal>12000
													THEN LEAVE loop_lab;
								END IF;
								
								#如果低于12000,更新员工工资
								UPDATE employees SET salary = salary * 1.1;
								#更新avg_sal 变量的值
								SELECT AVG(salary) INTO avg_sal FROM employees;
								
								#记录循环次数
								SET loop_count = loop_count +1;								
				END LOOP loop_lab;
						
				#给num赋值
				SET num = loop_count;		
END //

DELIMITER;

SELECT AVG(salary) FROM employees;
CALL  update_salary_loop(@num);

SELECT @num;

循环结构之WHILE

在这里插入图片描述


#循环结构WHILE

/*
	凡是循环结构,一定具备四个要素
	1、初始化条件
	2、循环条件
	3、循环体
	4、迭代条件
*/

#举例1:
DELIMITER //

CREATE PROCEDURE test_while()
BEGIN 
			#初始化条件
			DECLARE num INT DEFAULT 1;
			#循环条件
			WHILE num <= 10 DO
			#循环体(略)
			
			#迭代条件
			SET num = num +1;
			END WHILE;
			#查询
			SELECT num;
END //

DELIMITER ;

#调用
CALL test_while();

#举例2:市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资
#声明存储过程"update_salary_while()",声明OUT参数num,输出循环次数
#存储过程中实现循环给大家降薪,薪资降为原来的90%,直到全公司的平均薪资达到5000,并统计循环次数。

DELIMITER //

CREATE PROCEDURE update_salary_while(OUT num INT )
BEGIN
			#声明变量
			DECLARE avg_sal DOUBLE ;#记录平均工资
			DECLARE while_count INT DEFAULT 0;#记录循环次数
			
			#赋值
			SELECT  AVG(salary) INTO avg_sal FROM employees;
			
			WHILE avg_sal >5000 DO
								UPDATE employees SET salary = salary *0.9;
								SET while_count = while_count +1;
								
								SELECT AVG(salary) INTO avg_sal FROM employees;
			END WHILE;
			
			#给num赋值
			SET num = while_count;
END //

DELIMITER;

DROP PROCEDURE update_salary_while;

#调用
CALL update_salary_while(@num);

SELECT @num;

SELECT AVG(salary) FROM employees;

循环结构之REPEAT

在这里插入图片描述

#循环结构之REPEAT

#举例1:
DELIMITER //

CREATE PROCEDURE test_repeat()

BEGIN

			#声明变量
			DECLARE num INT DEFAULT 1;
			
			REPEAT
							SET num = num +1 ;
							UNTIL num>=10
	
			END REPEAT;
			#查看
			SELECT num;

END //

DELIMITER ;

#调用
CALL test_repeat();

#举例2:当市场环境变好时,公司为了奖励大家,决定给大家涨工资
#声明存储过程"update_salary_repeat()",声明OUT参数num,输出循环次数
#存储过程中实现循环给大家涨薪,薪资涨为原来的1.15倍。直到全公司的平均工资为13000结束,并统计循环次数。

DELIMITER //

CREATE PROCEDURE update_salary_repeat(OUT num INT )
BEGIN
			#声明变量
			DECLARE avg_sal DOUBLE ;#记录平均工资
			DECLARE repeat_count INT DEFAULT 0;#记录循环次数
			
			#赋值
			SELECT  AVG(salary) INTO avg_sal FROM employees;
			REPEAT
						UPDATE employees SET salary = salary *1.15;
						
						SET repeat_count = repeat_count +1;
				
						SELECT  AVG(salary) INTO avg_sal FROM employees;
						
						UNTIL avg_sal >=13000

			END REPEAT;

			#给num赋值
			SET num = repeat_count;
END //

DELIMITER;

#调用
CALL update_salary_repeat(@num);
SELECT @num;

SELECT AVG(salary) FROM employees;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值