mysql(while,repeat,loop) 循环语句的使用

Posted 草莓果冻ovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql(while,repeat,loop) 循环语句的使用相关的知识,希望对你有一定的参考价值。

学习目标:

掌握 mysql循环语句的使用


学习内容:

  1. while循环
  2. repeat循环
  3. loop

代码实例:

1.while 循环条件  do   #执行循环的条件
      循环体语句;        #必须含有修改循环条件的语句
    end while;
1:如果成绩表SC中存在不及格学生的成绩,将所有学生的成绩在原来的基础上提高5%,直到表中不再存在不及格学生为止。
    -- 分析
    select * from sc where degree<60;
    update sc set degree=degree*1.05;
    -- 1
    if  exists(select * from sc where degree<60)  then 
        update sc set degree=degree*1.05;
    end if;
    -- 2
    desc sc;
    declare cj decimal(28,0);
    select cj=(select min(degree) from sc);
    if cj<60 then 
        update sc set degree=degree*1.05;
    end if;
    -- 编程
    delimiter //
    create procedure rw1()
    begin
        set @cj=(select min(degree) from sc);
        while @cj<60 do
            update sc set degree=degree*1.05;
            set @cj=(select min(degree) from sc);
        end while;
    end //
    delimiter ;
    call rw1();

   任务一: 用WHILE…END WHILE语句求1…100的所有奇数之和。

方法一:
    delimiter //
    create procedure rw2()
    begin
        set @s=0,@i=1;
        while @i<=100 do
            if @i%2<>0 then
                set @s=@s+@i;
            end if;
            set @i=@i+1;
        end while;
        select @s as '1…100的所有奇数之和';
    end //
    delimiter ;
    call rw2();        
    
  方法二:  
   delimiter //
    create procedure rw3()
    begin
        set @s=0,@i=1;
        while @i<=100 do
            set @s=@s+@i;
            set @i=@i+2;
        end while;
        select @s as '1…100的所有奇数之和';
    end //
    delimiter ;
    call rw3();

    2.repeat 循环
    repeat 
         循环体语句;
   until 条件   #退出循环的条件
    end repeat;     
    
例  1:如果成绩表SC中存在不及格学生的成绩,将所有学生的成绩在原来的基础上提高5%,直到表中不再存在不及格学生为止。
select * from sc;
    delimiter //
    create procedure rw4()
    begin
    select min(degree) into @cj  from sc;
    repeat
        update sc set degree=degree*1.05;
      select min(degree) into @cj  from sc;
        until @cj>=68
    end repeat;
    end //
    delimiter ;
    call rw4();

    3.loop循环
标签名:loop
        循环体语句;
      if 条件  then  #退出循环的条件
             leave 标签名;
      end if;    
    end loop;
    1:如果成绩表SC中存在不及格学生的成绩,将所有学生的成绩在原来的基础上提高5%,直到表中不再存在不及格学生为止。

    delimiter //
    create procedure rw5()
    begin
    www:loop
            update sc set degree=degree*1.05;
        select min(degree) into @cj  from sc;
            if @cj>88 then
                leave www;
            end if;
         end loop;
    end //
    
    delimiter ;
    call rw5();

MySQL 流程控制

1、MySQL 流程控制语句

  • MySQL 中可以使用 if、case、loop、leave、iterate、repeat 及 while 语句进行流程的控制。

1.1 if 语句

  • if 实现条件判断,满足不同的条件执行不同的语句列表。

    # if 语句
    
    # IF 
        search_condition 
      THEN 
        statement_list
      [ELSEIF search_condition THEN statement_list] ...
      [ELSE statement_list]
      END IF
    
    > if 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end if;

1.2 case 语句

  • case 实现比 if 更复杂一些的条件构造。

    # case 语句
    
    # CASE
      WHEN 
        search_condition 
      THEN 
        statement_list
      [WHEN search_condition THEN statement_list] ...
      [ELSE statement_list]
      END CASE
    
    # CASE 
        case_value
      WHEN 
        when_value 
      THEN 
        statement_list
      [WHEN when_value THEN statement_list] ...
      [ELSE statement_list]
      END CASE
    
    > case
      when 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end case;
    
    > case 
        i_staff_id
      when 
        2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end case;

1.3 loop 语句

  • loop 实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 leave 语句实现。

    # loop 语句
    
    # [begin_label:] LOOP
        statement_list
      END LOOP [end_label]
  • 如果不在 statement_list 中增加退出循环的语句,那么 loop 语句可以用来实现简单的死循环。

1.4 leave 语句

  • leave 用来从标注的流程构造中退出,通常和 BEGIN ... END 或者循环一起使用。

  • 下面是一个使用 loop 和 leave 的简单例子,循环 100 次向 actor 表中插入记录,当插入 100 条记录后,退出循环。

    # leave 语句
    
    > create procedure actor_insert ()
      BEGIN
        set @x = 0;
      ins: LOOP
        set @x = @x + 1;
      IF 
        @x = 100 
      THEN
        LEAVE ins;
      END IF;
      INSERT INTO actor (first_name, last_name) VALUES ('Test', '201');
      END LOOP ins;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
    > call actor_insert();
    
        Query OK, 0 rows affected (0.01 sec)
    
    > select count(*) from actor where first_name = 'Test';
    
        +----------+
        | count(*) |
        +----------+
        |      100 |
        +----------+
        1 row in set (0.00 sec)

1.5 iterate 语句

  • iterate 必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。

  • 下面的例子使用了 iterate 语句,当 @x 变量是偶数的时候,不再执行循环中剩下的语句,而直接进行下一轮的循环。

    # iterate 语句
    
    > CREATE PROCEDURE actor_insert ()
      BEGIN
        set @x = 0;
      ins: LOOP
        set @x = @x + 1;
      IF 
        @x = 10 
      THEN
        LEAVE ins;
      ELSEIF 
        mod(@x,2) = 0 
      THEN
        ITERATE ins;
      END IF;
      INSERT INTO actor(actor_id,first_name,last_name) VALUES (@x+200, 'Test',@x);
      END LOOP ins;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
    > call actor_insert();
    
        Query OK, 0 rows affected (0.00 sec)
    
    > select actor_id,first_name,last_name from actor where first_name='Test';
    
        +----------+------------+-----------+
        | actor_id | first_name | last_name |
        +----------+------------+-----------+
        |      201 |       Test |         1 |
        |      203 |       Test |         3 |
        |      205 |       Test |         5 |
        |      207 |       Test |         7 |
        |      209 |       Test |         9 |
        +----------+------------+-----------+
        5 rows in set (0.00 sec)

1.6 repeat 语句

  • repeat 有条件的循环控制语句,当满足条件的时候退出循环。

    # repeat 语句
    
    # [begin_label:] REPEAT
        statement_list
      UNTIL 
        search_condition
      END REPEAT [end_label]
    
    > REPEAT
      FETCH cur_payment INTO i_staff_id, d_amount;
      if 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end if;
      UNTIL 
        0 
      END REPEAT;

1.7 while 语句

  • while 实现的也是有条件的循环控制语句,即当满足条件时执行循环的内容。

  • while 循环和 repeat 循环的区别

    • while 是满足条件才执行循环,repeat 是满足条件退出循环;
    • while 在首次循环执行之前就判断条件,所以循环最少执行 0 次,而 repeat 是在首次执行循环之后才判断条件,所以循环最少执行 1 次。
    # while 语句
    
    # [begin_label:] WHILE search_condition DO
      statement_list
      END WHILE [end_label]
    
    > delimiter $$
    > CREATE PROCEDURE loop_demo ()
      BEGIN
        set @x = 1 , @x1 = 1;
      REPEAT
        set @x = @x + 1;
      UNTIL 
        @x > 0 
      END REPEAT;
    
      WHILE 
        @x1 < 0 
      DO
        set @x1 = @x1 + 1;
      END WHILE;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
      > delimiter ;
      > call loop_demo();
    
        Query OK, 0 rows affected (0.00 sec)
    
      > select @x,@x1;
    
        +------+------+
        | @x   | @x1  |
        +------+------+
        |    2 |    1 |
        +------+------+
        1 row in set (0.00 sec)

以上是关于mysql(while,repeat,loop) 循环语句的使用的主要内容,如果未能解决你的问题,请参考以下文章

mysql循环控制语句

mysql 存储过程 与 循环

流程控制语句(MySQL/MariaDB )

MySQL存储过程中的3种循环

MySQL 循环分支语法

写一个简单的存储过程