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 语句都可以写成循环,让程序自动跑,防止手动修改参数意外出错。

参考资料

相关推荐
changshuaihua00122 分钟前
Redis 详解:Redis 与 MySQL 的区别、数据类型与缓存三大问题
数据库·redis·缓存
qetfw30 分钟前
Debian 配置 AIDE 文件完整性检测:基线初始化、变更检查与数据库更新
linux·网络·数据库·debian
Elastic 中国社区官方博客44 分钟前
Elasticsearch:搜索教程 - 语义搜索(三)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
随风M记忆s2 小时前
Redis支持事务吗?了解Redis的持久化机制吗?
数据库·redis·bootstrap
花青泽4 小时前
5-数据库-SQL注入-联合查询-关键字绕过-day13
数据库·sql
天桥下的卖艺者10 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
隔窗听雨眠10 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
数据库小学妹10 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
神龙天舞200111 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈13 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库