19. Mysql 循环语句

文章目录

概念

循环结构是编程中常见的控制结构,它允许我们重复执行一段代码,直到满足特定条件为止。

在 Mysql 中,常用来实现各种复杂的逻辑操作和对满足条件的数据进行批量操作,提高数据处理的效率和灵活性,例如批量处理数据、生成序列号和数据动态透视等。

循环语句

while 循环语句

while 循环语句是 MySQL 中最基本的循环语句,它创建一个带条件判断的循环过程。while 在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。

sql 复制代码
[while_label:] while 循环条件  do
                     循环体
               end while [while_label];

while_label 为语句的标注名称,可以省略;循环体里面一般会写终止条件,否则无限死循环。

示例

sql 复制代码
drop procedure if exists update_salary_while;
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;
	set num = while_count;-- 给num赋值
end;

call update_salary_while(@num); -- 调用
select @num;
select avg(salary) from employees;

repeat 循环语句

repeat 循环首先会执行一次循环,然后在 until 中进行表达式的判断,如果满足条件就退出,即 end repeat ;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。

sql 复制代码
[repeat_label:] repeat
             循环体的语句
                    until 结束循环的条件表达式
                end repeat [repeat_label];

repeat_label 为 repeat 语句的标注名称,该参数可以省略;repeat 语句内的语句或语句群被重复,直至 结束循环的条件表达式 为真。

示例

sql 复制代码
drop procedure if exists update_salary_repeat;
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;
	set num = repeat_count;-- 给num赋值		
end;
call update_salary_repeat(@num);
select @num;
select avg(salary) from employees;

loop 循环语句

loop 循环语句用来重复执行某些语句。循环执行的语句一直重复执行直到循环被退出(使用 leave 子句),跳出循环过程。

sql 复制代码
[loop_label:] loop
                循环执行的语句
              end loop [loop_label];

loop_label 为 loop 的标注名称,可以省略;常常和 iterate 、 leave 语句配合使用。

示例

sql 复制代码
drop procedure if exists update_salary_repeat;
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;
		# 迭代条件
		select avg(salary) into avg_sal from employees;-- 更新avg_sal变量的值
		set loop_count = loop_count + 1;-- 记录循环次数
	end loop loop_lab;
	set num = loop_count;-- 给num赋值
end;
call update_salary_loop(@num);
select @num;

iterate 和 leave 语句

iterate 语句表示重新开始循环,将执行顺序转到语句段开头处,可以理解为 Python 中的 continue 。

leave 语句表示跳出循环或者跳出程序体的操作,类似于 Python 中的 break 。

示例

sql 复制代码
drop procedure iterate_leave_test;
create procedure iterate_leave_test()
begin
	declare num int default 0;
	loop_label:loop
		#赋值
		set num = num + 1;
		if num  < 10
			then iterate loop_label;-- 满足则跳出循环,重新开始循环
		elseif num > 15
			then leave loop_label;-- 满足则跳出并结束循环
		end if;
		insert into sql_test1.test(id, name, sale) values (num,'test',1);
	end loop;
end;
call iterate_leave_test(); -- 调用

精选示例

随机生成批量指定长度的密码。

sql 复制代码
drop procedure if exists generate_pwd;
create procedure generate_pwd(in len int, in cnt int)
begin
    declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789';
    declare return_str varchar(255) default '';
    truncate table sql_test1.pwd;
    set @j = 1;
    while @j <= cnt do
        set @i = 1;
        set @return_str = '';
        while @i <= len do
            set @return_str = concat(@return_str, substring(chars_str, floor(1 + rand() * 62), 1));
            set @i = @i + 1;
        end while;
        insert into sql_test1.pwd(id, pwd) values (@j, @return_str);
        set @j = @j + 1;
    end while;
    select * from sql_test1.pwd;
end;
call generate_pwd(30,10);
+------+--------------------------------+
| id   | pwd                            |
+------+--------------------------------+
|    1 | u5obsl9zdejker8zoppsfovz1xastz |
|    2 | hwcns3u97zqyr9ho0s85u8orelh3ze |
|    3 | 7uuxsmziu6rsbgmopwy9hr1ng5gtta |
|    4 | lnmnmvjto43vgnwrbszjjverot1vl3 |
|    5 | 2s7nslhysgxkyr8dviwllemnurhjrr |
|    6 | nfif1xzoaexojyjbflbo3habkipknr |
|    7 | xhoyvrzlteieculu9pzazf9osi2s5d |
|    8 | mrmajvvbkfeyzuqcab0jpwke6pawju |
|    9 | b2t4ncwab3ysqcc7zknox6h2vlnnqb |
|   10 | bzzow8gr4dmpgiqlri8l9yb5ibz8pb |
+------+--------------------------------+

使用了 while 嵌套,定义了两个输入参数,分别是秘密长度和生成的数量,我们只要确定这两个参数就可以得到想要的批量密码。随机生成批量密码有多种方法,如果想了解更多,可以查看 Mysql 生成批量随机密码Mysql 自定义函数

总结

通过本文,我们了解了MySQL中的循环语句及其用法。使用循环或者嵌套循环能帮助我们处理各种复杂的数据操作和逻辑处理,当遇到需要重复执行的 sql 语句都可以写成循环,让程序自动跑,防止手动修改参数意外出错。

参考资料

相关推荐
广州智造4 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥7 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1238 小时前
Redis解析
数据库·redis·缓存
数据库幼崽8 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd9 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou9 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh10 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵11 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多12 小时前
Linux——mysql主从复制与读写分离
数据库·mysql