MySQL学习-流程控制-REPEAT、LEAVE与ITREATE语句

321 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 ;

三种循环结构的对比:

  1. 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
  2. LOOP:一般用于实现简单的循环。
  3. WHILE:先判断后执行。
  4. 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 ;

今天就把流程控制学完了,先学习到这里,明天继续。