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

这篇具有很好参考价值的文章主要介绍了十九、MySQL 循环结构之LOOP、WHILE、REPEAT、LEAVE、ITERATE 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、循环结构之 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:LOOP
		IF 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: LOOP
		SET 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: LOOP
		IF 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 DO
	SET 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 DO
	while_label: WHILE TRUE DO
	IF avg_sal <= 5000
		THEN 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: REPEAT
		SET 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) 
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; 
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: BEGIN
	IF num <=0
		THEN LEAVE leave_label;
	ELSEIF num = 1
		THEN SELECT AVG(salary) FROM employees;
	ELSEIF num = 2
		THEN SELECT MIN(salary) FROM employees;
	ELSEIF num > 2
		THEN 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 THEN
			LEAVE 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()
BEGIN
	DECLARE num1,result INT DEFAULT 0;
	my_while: WHILE num1 < 10 DO
	IF num1 > 10
		THEN ITERATE my_while;
	END IF;
	IF num1 % 2 = 0
		THEN SET result = result + num1;
	END IF;
	SET num1 = num1 + 1;	
	END WHILE my_while;
	SELECT result;
END //
DELIMITER ;
CALL test_iterate(); -- 20

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


mysql 循环,MySQL8.0从菜鸟到大牛,数据库,mysql

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

到了这里,关于十九、MySQL 循环结构之LOOP、WHILE、REPEAT、LEAVE、ITERATE 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java程序设计入门教程---循环结构(while)

    目录 思考 概念 语法 案例:求1到100的整数和? 案例分析 思考            1. 让你输出10000000000000000句“Hello,world!”,你怎么写代码?            2. 求1到100的整数和? 概念            循环结构程序 多次 循环执行相同或相近的任务。            while循环,也叫作当型循

    2024年02月02日
    浏览(57)
  • 【java探索之旅】走进循环结构 深入解析while、for和do while的用法

    🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 循环结构是编程中非常重要和常用的一种控制结构,它允许程序重复执行一段代码,以实现特定的功能。在本文中,我们将详细介绍while循环、for循环和do while循环的语法和用法,并提供了一

    2024年04月13日
    浏览(47)
  • abap Loop循环用法

    LOOP AT itab - Basic Form 语句LOOP AT itab的这个变体对每个读取行执行一次LOOP和ENDLOOP之间的语句块。 ◾ 输出响应结果确定读取行内容的方式和位置。 ◾ 执行循环时使用的表键可以在条件中确定。要么读取所有行,要么指定条件来限制读取哪些行。 ◾ AT…ENDAT可用于定义控制级处

    2024年02月13日
    浏览(35)
  • 浏览器事件循环Event Loop

    引言: 事件循环不是浏览器独有的,从字面上看,“循环”可以简单地认为就是重复,比如for循环,就是重复地执行for循环体中的语句,所以事件循环,可以理解为重复地处理事件,那么下一个问题是,处理的是什么事件,事件的相关信息从哪里获取。 因为我没有用nodejs做

    2024年02月05日
    浏览(51)
  • DEDECMS教程之loop循环标签的使用详解

    DedeCMS v5.7的loop标签非常有用,可以使用它来调用任意表中的数据,我们先来看看loop标签的语法结构。 上面就是loop标签的语法了,其中table_name指的是表名,也就是要查询的数据所在的表;condition是条件,相当于SQL语句中的where;field_name指的是排序方式,相当于SQL语句中的o

    2024年02月02日
    浏览(36)
  • 【P31】JMeter 循环控制器(Loop Controller)

    可以对部分逻辑按常量进行循环迭代 选择线程组右键 添加 逻辑控制器 循环控制器(Loop Controller) Loop Count:设置运行次数,Infinite 勾选为永久运行 2.1、设置循环次数 (1)、测试计划右键 添加 线程(用户) 线程组 参数默认即可 (2)、线程组右键 添加 取样器 调试取样器

    2024年02月07日
    浏览(47)
  • 解释一下Node.js中的事件循环(event loop)

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月05日
    浏览(45)
  • 一文带你彻底弄懂js事件循环(Event Loop)

    JavaScript事件循环是JavaScript运行时环境中处理异步操作的机制。它允许JavaScript在执行同步代码的同时处理异步任务,以避免阻塞线程并提供更好的用户体验。 本文将在浏览器异步执行原理基础上带你彻底弄懂js的事件循环机制。 js是单线程的,也就是说同一时刻只能做一件事

    2024年02月08日
    浏览(48)
  • Python学习-流程图、分支与循环(branch and loop)

    1、流程图(Flowchart) 流程图是一种用于表示算法或代码流程的框图组合,它以不同类型的框框代表不同种类的程序步骤,每两个步骤之间以箭头连接起来。 好处: 1)代码的指导文档 2)有助于规划高效率的程序结构 3)便于与他人交流 流程图的思维是至上往下走的,线性逻

    2024年02月21日
    浏览(52)
  • 【PyTorch】6.Learn about the optimization loop 了解优化循环

    现在我们有了模型和数据,是时候通过优化数据上的参数来训练、验证和测试我们的模型了。训练模型是一个迭代过程;在每次迭代中,模型都会对输出进行猜测,计算其猜测中的误差( 损失 ),收集相对于其参数的导数的误差(如我们在上一节中看到的),并使用梯度下

    2024年01月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包