文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

十九、MySQL 循环结构之LOOP、WHILE、REPEAT、LEAVE、ITERATE 详解

2023-09-04 06:02

关注

文章目录

一、循环结构之 LOOP

LOOP 循环语句用来重复执行某些语句。LOOP 内的语句一直重复执行直到循环被退出(使用 LEAVE 子句),跳出循环过程。LOOP 语句的基本格式如下:

-- loop_label表示LOOP语句的标注名称,该参数可以省略[loop_label:] LOOP   -- 循环执行的语句END LOOP [loop_label] 

举例1:使用 LOOP 语句进行循环操作,id值小于10时将重复执行循环过程。

DELIMITER //CREATE PROCEDURE test_loop()BEGIN DECLARE id INT DEFAULT 0;add_loop:LOOPIF id < 10 THEN SET id = id + 1;ELSE   LEAVE add_loop;END IF;END LOOP add_loop;SELECT id;END //DELIMITER ;CALL test_loop();

举例2:应用LOOP语句求前100项的和。首先定义变量i和s,分别用来控制循环的次数和保存前100项的和,进入该循环体后首先使s的值加i,之后使i加1并进入下次循环,直到i大于100,通过LEAVE语句退出循环并输出结果。

DROP PROCEDURE get_sum;DELIMITER //CREATE PROCEDURE get_sum(OUT result INT)BEGIN DECLARE i INT DEFAULT 1;DECLARE s INT DEFAULT 0;get_sum_loop: LOOPSET s = s + i;IF i >= 100 THEN LEAVE get_sum_loop;END IF;SET i = i + 1;END LOOP get_sum_loop;SET result = s;END //DELIMITER ;CALL get_sum(@s);SELECT @s;

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

DROP PROCEDURE update_salary_loop;DELIMITER //CREATE PROCEDURE update_salary_loop(OUT num INT)BEGIN DECLARE emp_avg_sal DOUBLE;DECLARE count_ INT DEFAULT 0;SELECT AVG(salary) INTO emp_avg_sal FROM employees;avg_salary_loop: LOOPIF emp_avg_sal > 12000 THEN LEAVE avg_salary_loop;END IF;UPDATE employees SET salary = salary * 1.1;SET count_ = count_ + 1;SELECT AVG(salary) INTO emp_avg_sal FROM employees;END LOOP avg_salary_loop;SET num = count_;END //DELIMITER ;CALL update_salary_loop(@x);SELECT @x;SELECT AVG(salary) FROM employees;

二、循环结构之 WHILE

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

[while_label:] WHILE 循环条件  DO循环体END WHILE [while_label];

while_label 为 WHILE 语句的标注名称;如果循环条件结果为真,WHILE 语句内的语句或语句群被执行,直至循环条件为假,退出循环。

举例1:应用WHILE语句求前50项的和。首先定义变量i和s,分别用来控制循环的次数和保存前50项和,当变量i的值小于或等于50时,使s的值加i,并同时使i的值增1。直到i大于50时退出循环并输出结果。

DROP PROCEDURE test_while;DELIMITER //CREATE PROCEDURE test_while(OUT num INT)BEGIN DECLARE i,s INT DEFAULT 0;while_label: WHILE i <= 50 DOSET s = s + i;SET i = i + 1;END WHILE while_label;SET num = s;END //DELIMITER ;CALL test_while(@x);SELECT @x;

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

DROP PROCEDURE update_salary_while;DELIMITER //CREATE PROCEDURE update_salary_while(OUT num INT)BEGIN DECLARE avg_sal DOUBLE;DECLARE `count` INT DEFAULT 0;SELECT AVG(salary) INTO avg_sal FROM employees;-- while_label: WHILE avg_sal > 5000 DOwhile_label: WHILE TRUE DOIF avg_sal <= 5000THEN LEAVE while_label;END IF;UPDATE employees SET salary = salary * 0.9;SET `count` = `count` + 1;SELECT AVG(salary) INTO avg_sal FROM employees;END WHILE while_label;SET num = `count`;END //DELIMITER ;CALL update_salary_while(@x);SELECT @x;SELECT AVG(salary) FROM employees;

三、循环结构之 REPEAT

REPEAT 语句创建一个带条件判断的循环过程。与 WHILE 循环不同的是,REPEAT 循环首先会执行一次循环,然后在 UNTIL 中进行表达式的判断,如果满足条件就退出,即 END REPEAT;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。REPEAT语句的基本格式如下:

[repeat_label:] REPEAT 循环体的语句UNTIL 结束循环的条件表达式 END REPEAT [repeat_label]

repeat_label 为 REPEAT 语句的标注名称,该参数可以省略;REPEAT 语句内的语句或语句群被重复,直至 expr_condition 为真。

举例1:应用REPEAT语句求前100项的和。首先定义变量i和s,分别用来控制循环的次数和保存前100项和,进入循环体后首先使s的值加i,之后使i的值加1,直到i大于100时退出循环并输出结果。

DELIMITER //CREATE PROCEDURE test_repeat(OUT num INT)BEGIN DECLARE i,s INT DEFAULT 0;repeat_label: REPEATSET s = s + i;SET i = i + 1;UNTIL i > 100 END REPEAT repeat_label;SET num = s;END //DELIMITER ;CALL test_repeat(@s);SELECT @s;

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

DELIMITER //CREATE PROCEDURE update_salary_repeat(OUT num INT) BEGINDECLARE avg_sal DOUBLE ;DECLARE repeat_count INT DEFAULT 0;SELECT AVG(salary) INTO avg_sal FROM employees;REPEATUPDATE 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; END //DELIMITER ;

对比三种循环结构:

  1. 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
  2. LOOP:一般用于实现简单的"死"循环,WHILE:先判断后执行,REPEAT:先执行后判断,无条件至少执行一次。

四、跳转语句之LEAVE语句

LEAVE 语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break。基本格式如下:

LEAVE 标记名

其中,label 参数表示循环的标志。LEAVE 和 BEGIN … END 或循环一起被使用。举例1:创建存储过程 leave_begin(),声明INT类型的IN参数num。给BEGIN…END加标记名,并在BEGIN…END中使用IF语句判断num参数的值。IF语句结束后查询 employees 表的总人数。

如果num<=0,则使用LEAVE语句退出BEGIN...END如果num=1,则查询 employees 表的平均薪资如果num=2,则查询 employees 表的最低薪资如果num>2,则查询 employees 表的最高薪资

示例:

DELIMITER //CREATE PROCEDURE leave_begin(IN num INT)leave_label: BEGINIF num <=0THEN LEAVE leave_label;ELSEIF num = 1THEN SELECT AVG(salary) FROM employees;ELSEIF num = 2THEN SELECT MIN(salary) FROM employees;ELSEIF num > 2THEN SELECT MAX(salary) FROM employees;SELECT COUNT(*) FROM employees;END IF;END //DELIMITER ;CALL leave_begin(3);

举例2:当市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程 leave_while(),声明OUT参数num,输出循环次数,存储过程中使用WHILE循环给大家降低薪资为原来薪资的90%,直到全公司的平均薪资小于等于10000,并统计循环次数。

DELIMITER //CREATE PROCEDURE leave_while(OUT num INT)BEGIN DECLARE avg_sal DOUBLE; #记录平均工资DECLARE while_count INT DEFAULT 0; #记录循环次数SELECT AVG(salary) INTO avg_sal FROM employees; #① 初始化条件  while_label: WHILE TRUE DO  #② 循环条件#③ 循环体IF avg_sal <= 10000 THENLEAVE while_label;END IF;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;END //DELIMITER ;

五、跳转语句之ITERATE语句

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为 continue,意思为 再次循环。 语句基本格式如下:

ITERATE label

label 参数表示循环的标志。ITERATE 语句必须跟在循环标志前面。举例: 求出10以内的偶数和;

DELIMITER //CREATE PROCEDURE test_iterate()BEGINDECLARE num1,result INT DEFAULT 0;my_while: WHILE num1 < 10 DOIF num1 > 10THEN ITERATE my_while;END IF;IF num1 % 2 = 0THEN SET result = result + num1;END IF;SET num1 = num1 + 1;END WHILE my_while;SELECT result;END //DELIMITER ;CALL test_iterate(); -- 20

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

来源地址:https://blog.csdn.net/xw1680/article/details/130119856

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯