凡是循环结构,一定具备4个要素:

  1. 初始化条件
  2. 循环条件
  3. 循环体
  4. 迭代条件

    loop

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

    语法

    LOOP语句的基本格式如下:

    1. [loop_label:] LOOP
    2. 循环执行的语句
    3. END LOOP [loop_label]

    其中,loop_label表示LOOP语句的标注名称,该参数可以省略。

    例子

    ```sql DELIMITER // CREATE PROCEDURE test_loop() BEGIN

    声明局部变量

    DECLARE num INT DEFAULT 1;

    loop_label:LOOP

    1. #重新赋值
    2. SET num = num + 1;
    3. #可以考虑某个代码程序反复执行。(略)
    4. IF num >= 10 THEN LEAVE loop_label;
    5. END IF;

    END LOOP loop_label;

    查看num

    SELECT num;

END //

DELIMITER ;

调用

CALL test_loop();

  1. 需求:<br />当市场环境变好时,公司为了奖励大家,决定给大家涨工资。声明存储过程“update_salary_loop()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家涨薪,薪资涨为原来的1.1倍。直到全公司的平均薪资达到12000结束。并统计循环次数。
  2. ```sql
  3. DELIMITER //
  4. CREATE PROCEDURE update_salary_loop(OUT num INT)
  5. BEGIN
  6. #声明变量
  7. DECLARE avg_sal DOUBLE ; #记录员工的平均工资
  8. DECLARE loop_count INT DEFAULT 0;#记录循环的次数
  9. #① 初始化条件
  10. #获取员工的平均工资
  11. SELECT AVG(salary) INTO avg_sal FROM employees;
  12. loop_lab:LOOP
  13. #② 循环条件
  14. #结束循环的条件
  15. IF avg_sal >= 12000
  16. THEN LEAVE loop_lab;
  17. END IF;
  18. #③ 循环体
  19. #如果低于12000,更新员工的工资
  20. UPDATE employees SET salary = salary * 1.1;
  21. #④ 迭代条件
  22. #更新avg_sal变量的值
  23. SELECT AVG(salary) INTO avg_sal FROM employees;
  24. #记录循环次数
  25. SET loop_count = loop_count + 1;
  26. END LOOP loop_lab;
  27. #给num赋值
  28. SET num = loop_count;
  29. END //
  30. DELIMITER ;
  31. SELECT AVG(salary) FROM employees;
  32. CALL update_salary_loop(@num);
  33. SELECT @num;

while

语法

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

  1. [while_label:] WHILE 循环条件 DO
  2. 循环体
  3. END WHILE [while_label];

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

例子

  1. DELIMITER //
  2. CREATE PROCEDURE test_while()
  3. BEGIN
  4. #初始化条件
  5. DECLARE num INT DEFAULT 1;
  6. #循环条件
  7. WHILE num <= 10 DO
  8. #循环体(略)
  9. #迭代条件
  10. SET num = num + 1;
  11. END WHILE;
  12. #查询
  13. SELECT num;
  14. END //
  15. DELIMITER ;
  16. #调用
  17. CALL test_while();

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

  1. DELIMITER //
  2. CREATE PROCEDURE update_salary_while(OUT num INT)
  3. BEGIN
  4. #声明变量
  5. DECLARE avg_sal DOUBLE ; #记录平均工资
  6. DECLARE while_count INT DEFAULT 0; #记录循环次数
  7. #赋值
  8. SELECT AVG(salary) INTO avg_sal FROM employees;
  9. WHILE avg_sal > 5000 DO
  10. UPDATE employees SET salary = salary * 0.9 ;
  11. SET while_count = while_count + 1;
  12. SELECT AVG(salary) INTO avg_sal FROM employees;
  13. END WHILE;
  14. #给num赋值
  15. SET num = while_count;
  16. END //
  17. DELIMITER ;
  18. #调用
  19. CALL update_salary_while(@num);
  20. SELECT @num;
  21. SELECT AVG(salary) FROM employees;

repeat

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

语法

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

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

例子

  1. DELIMITER //
  2. CREATE PROCEDURE test_repeat()
  3. BEGIN
  4. #声明变量
  5. DECLARE num INT DEFAULT 1;
  6. REPEAT
  7. SET num = num + 1;
  8. UNTIL num >= 10
  9. END REPEAT;
  10. #查看
  11. SELECT num;
  12. END //
  13. DELIMITER ;
  14. #调用
  15. CALL test_repeat();

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

  1. DELIMITER //
  2. CREATE PROCEDURE update_salary_repeat(OUT num INT)
  3. BEGIN
  4. #声明变量
  5. DECLARE avg_sal DOUBLE ; #记录平均工资
  6. DECLARE repeat_count INT DEFAULT 0; #记录循环次数
  7. #赋值
  8. SELECT AVG(salary) INTO avg_sal FROM employees;
  9. REPEAT
  10. UPDATE employees SET salary = salary * 1.15;
  11. SET repeat_count = repeat_count + 1;
  12. SELECT AVG(salary) INTO avg_sal FROM employees;
  13. UNTIL avg_sal >= 13000
  14. END REPEAT;
  15. #给num赋值
  16. SET num = repeat_count;
  17. END //
  18. DELIMITER ;
  19. #调用
  20. CALL update_salary_repeat(@num);
  21. SELECT @num;
  22. SELECT AVG(salary) FROM employees;

三种循环结构对比

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