MySQL流程控制语句是用来控制语句的执行,构造控制流程的语句有:
IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句,
本文主要说明流程控制语句中的 循环语句。
1、条件语句
1.1、if-then -else语句
语法:
IF (expr_condition) THEN
....do something.....
ELSEIF (expr_condition) THEN
....do something.....
ELSE
....do something.....
END IF;
示例:
DELIMITER $$
CREATE PROCEDURE proc1(IN parameter int)
begin
declare var int;
set var=parameter+1;
if var=0 then
insert into test values(17);
end if;
if parameter=0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;
$$
DELIMITER ;
1.2、case语句:
CASE语句有两种语法格式:
CASE
WHEN expr_condition THEN ...do something...
WHEN expr_condition THEN ...do something...
....多个 WHEN THEN 语句.....
[ELSE ...do something...]
END CASE;
其中expr_condition为条件表达式,计算结果为true,则执行THEN后面的语句。多个WHEN...THEN依次执行,ELSE为可选条件。
另外一种语法格式:
CASE case_expr
WHEN expr THEN .....do something....
WHEN expr THEN .....do something...
....多个表达式...
[ELSE ...dosomething..]
END CASE;
其中,case_expr表示条件判断的表达式,WHEN后的表达式结果如果和case_expr匹配,则执行相应的THEN后面的语句。没有则执行ELSE,ELSE为可选。
这种语法类似switch...case(建议使用第一种,逻辑清晰一点)。
DELIMITER $$
CREATE PROCEDURE proc1(IN parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then
insert into t values(17);
when 1 then
insert into t values(18);
else
insert into t values(19);
end case;
end;
$$
DELIMITER ;
2、循环语句
2.1、WHILE循环(先判断再执行)
2.1.1、语句结构:
[WHILE标注] : WHILE 条件表达式 DO
执行语句
UNTIL 条件表达式
END REPEAT [REPEAT标注]
其中,“WHILE标注” 为可选,表示WHILE循环语句的标签。WHILE的执行过程是,先判断条件表达式 expr_condition,如果为true执行循环,否则结束循环(与REPEAT的区别是:WHILE先判断条件,REPEAT是后判断条件)。
2.1.2、创建存储过程示例
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为$$
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int default 5; -- 申明变量
while i < 10 do -- 结束循环的条件: 当i大于10时跳出while循环
insert into test values (i); -- 往test表添加数据
set i = i + 1; -- 循环一次,i加一
end while; -- 结束while循环
select * from test; -- 查看test表数据
end;
$$ -- 结束定义语句
delimiter ;
调用存储过程:
call test(); #调用存储过程
2.2、repeat循环(先执行再判断)
它在执行操作后检查结果,而while则是执行前进行检查。
2.2.1、语句结构
[REPEAT标注]:REPEAT
执行语句
UNTIL 条件表达式
END REPEAT [REPEAT标注]
其中, “REPEAT标注” 为可选,表示REPEAT循环语句的标签,UNTIL指定循环条件。
REPEAT执行过程是:每次循环体执行完毕需要去判断一下条件表达式expr_condition,如果为true继续执行,否则结束循环。
2.2.2、 创建存储过程示例
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为双斜杠
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int default 6; -- 申明变量
repeat
insert into test values (i); -- 往test表添加数据
set i = i + 1; -- 循环一次,i加一
until i > 10 end repeat; -- 结束循环的条件: 当i大于10时跳出repeat循环
select * from test; -- 查看test表数据
end;
$$ -- 结束定义语句
delimiter ;
调用存储过程:
call test(); #调用存储过程
2.3、loop循环
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
2.3.1、语句结构
[loop标注]:LOOP
执行语句
END LOOP [loop标注]
2.3.2、 创建存储过程示例
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为双斜杠
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int default 7; -- 申明变量
lp : loop -- lp为循环体名,可随意 loop为关键字
insert into test values (i); -- 往test表添加数据
set i = i + 1; -- 循环一次,i加一
if i > 10 then -- 结束循环的条件: 当i大于10时跳出loop循环
leave lp;
end if;
end loop;
select * from test; -- 查看test表数据
end;
$$ -- 结束定义语句
delimiter ;
调用存储过程:
call test(); #调用存储过程
2.4、ITERATE语句
再次循环,将执行顺序转到语句开头处,只能用于LOOP,REPEAT和WHILE语句内。(类似于其他代码语言的continue)
2.4.1、语句结构
ITERATE [LOOP/REPEAT/WHILE标注]
2.4.2、创建存储过程示例
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为双斜杠
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int(11) default 0; -- 申明变量
myloop:loop
set i = i + 1;
if i < 5 then iterate myloop;
elseif i > 8 then leave myloop;
end if;
insert into test values (i);
end loop myloop;
select * from test;
end;
$$
delimiter ; -- 结束定义语句
调用存储过程:
call test(); #调用存储过程