携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
前言
上篇我们学习了MySQL中的流程控制-LOOP与WHILE语句。有兴趣的小伙伴可以阅读(# MySQL学习-流程控制-LOOP与WHILE语句)。
下面我们学习MySQL中的流程控制-REPEAT、LEAVE与ITREATE语句。
REPEAT循环语句
REPEAT语句创建一个带条件的循环过程。与WHILE循环不同的是,REPEAT循环首先会执行一次循环,然后在UNTIL中进行表达式的判断,如果满足条件就退出,即END REPEAT;如果条件不满足,则会继续执行循环,直到满足退出条件为止。语法如下:
[repeat_label:] REPEAT
循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]
repeat_label为REPEAT语句的标注名称,该参数可以省略。REPEAT语句内的语句或语句群被重复,直至条件为真。
举例一
DELIMITER //
CREATE PROCEDURE test_repeat()
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
UNTIL i >= 10
END REPEAT;
SELECT i;
END //
DELIMITER ;
举例二
创建存储过程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 ;
三种循环结构的对比:
- 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
- LOOP:一般用于实现简单的循环。
- WHILE:先判断后执行。
- REPEAT:先执行后判断,无条件执行一次。
LEAVE跳转语句
LEAVE语句:可以用在循环语句内,或以BEGIN和END包裹起来的程序体内,表示跳出循环或跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把LEAVE理解为break。
LEAVE 标记名
其中,标记名表示循环的标志。LEAVE和BEGIN...END或循环一起被使用。
举例一
创建存储过程leave_while(),声明OUT参数num,输出循环参数。存储过程中实现循环给大家降薪,薪资降为原来的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_lable:WHILE TRUE DO
IF avg_sal <= 10000
THEN LEAVE while_lable;
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 ;
ITREATE跳转语句
ITREATE语句只能在循环语句中,表示重新开始循环,将执行顺序转到语句开头处。可以理解为JAVA中的continue,意思是再次循环。语法如下:
ITERATE label
label参数表示循环的标志,ITERATE语句必须跟在循环标志前面。
举例一
定义变量num,初始值0。循环执行num+1操作。如果num < 10,则继续执行循环。如果num > 15,则退出循环结构。
DELIMITER //
CREATE PROCEDURE test_iterate();
BEGIN
DECLARE num INT DEFAULT 0;
my_loop:LOOP
SET num = num + 1;
IF num < 10
THEN ITERATE my_loop;
ELSEIF num > 15
THEN LEAVE my_loop;
END IF;
SELECT num;
END LOOP my_loop;
END //
DELIMITER ;
今天就把流程控制学完了,先学习到这里,明天继续。