mysql(while,repeat,loop) 循环语句的使用
Posted 草莓果冻ovo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql(while,repeat,loop) 循环语句的使用相关的知识,希望对你有一定的参考价值。
学习目标:
掌握 mysql循环语句的使用
学习内容:
- while循环
- repeat循环
- 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) 循环语句的使用的主要内容,如果未能解决你的问题,请参考以下文章