19. Mysql 循环语句

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 19. Mysql 循环语句

概念

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

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

参考资料

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 SQL Java
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
759 0
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
|
存储 关系型数据库 MySQL
MySQL的存储过程——流程控制-while、repeat、loop循环
MySQL的存储过程——流程控制-while、repeat、loop循环
582 0
MySQL的存储过程——流程控制-while、repeat、loop循环
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-循环(while、repeat、loop)
MySQL数据库——存储过程-循环(while、repeat、loop)
1296 0
|
6月前
|
存储 关系型数据库 MySQL
mysql 存储过程游标 循环输出select 查询结果
mysql 存储过程游标 循环输出select 查询结果
123 0
|
存储 关系型数据库 MySQL
MySQL中利用存储过程实现循环批量建表
MySQL中利用存储过程实现循环批量建表
11217 1
|
SQL 关系型数据库 MySQL
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
2299 0
|
7月前
|
存储 SQL 关系型数据库
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
99 0
|
存储 关系型数据库 MySQL
mysql 循环和游标使用
mysql 循环和游标使用
|
存储 关系型数据库 MySQL
MySQL存储过程中双层游标嵌套循环实例
MySQL存储过程中双层游标嵌套循环实例
|
关系型数据库 MySQL PHP
MySQL实战基础知识入门(8):SMARTY 二次循环数组的输出方法
MySQL实战基础知识入门(8):SMARTY 二次循环数组的输出方法
73 0