概念
循环结构是编程中常见的控制结构,它允许我们重复执行一段代码,直到满足特定条件为止。
在 Mysql 中,常用来实现各种复杂的逻辑操作和对满足条件的数据进行批量操作,提高数据处理的效率和灵活性,例如批量处理数据、生成序列号和数据动态透视等。
循环语句
while 循环语句
while 循环语句是 MySQL 中最基本的循环语句,它创建一个带条件判断的循环过程。while 在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。
[while_label:] while 循环条件 do 循环体 end while [while_label];
while_label 为语句的标注名称,可以省略;循环体里面一般会写终止条件,否则无限死循环。
示例
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 ;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。
[repeat_label:] repeat 循环体的语句 until 结束循环的条件表达式 end repeat [repeat_label];
repeat_label 为 repeat 语句的标注名称,该参数可以省略;repeat 语句内的语句或语句群被重复,直至 结束循环的条件表达式 为真。
示例
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 子句),跳出循环过程。
[loop_label:] loop 循环执行的语句 end loop [loop_label];
loop_label 为 loop 的标注名称,可以省略;常常和 iterate 、 leave 语句配合使用。
示例
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 。
示例
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(); -- 调用
精选示例
随机生成批量指定长度的密码。
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 语句都可以写成循环,让程序自动跑,防止手动修改参数意外出错。