MySQL流程控制语句
在MySQL中,常见的过程式SQL语句可以用在一个存储过程体中,其中就包含IF语句、CASE语句、WHILE语句、LOOP语句、REPEAT语句、LEAVE语句和ITERATE语句,它们可以进行流程控制。
定义一个存储过程体的模板是:
delimiter 结束符号
create procedure 存储过程体名(in/out 变量名 变量类型)
begin
存储过程体
end
结束符号
其中,结束符号一般使用“//”,它作为调用此存储过程体的结束标志。
存储过程体名要是MySQL中有效的标识符,in/out表示调用此存储过程体时输入还是输出。
IF语句
IF语句可以用来进行条件判断,根据条件的真假执行不同的操作。
IF语句的表示形式如下:
IF condition THEN
...
[ELSEIF condition THEN]
...
[ELSE]
...
END IF
其中,condition表示判断条件。如:
delimiter //
create procedure example_if(in x int)
begin
if x=1 then select 1;
elseif x=2 then select 2;
else select 'other';
end if;
end
//
![运行结果](/assets/image-20221015233250618-Q2DWnq2r.png)
CASE 语句
CASE语句为多分支语句,该语句首先从WHEN后的VALUE中查找与CASE后的VALUE相等的值,如果查找到则执行该分支的语句,否则执行ELSE后面的内容。
CASE语句的语法如下:
CASE value
WHEN value THEN...
[WHEN value THEN ...]
[ELSE ...]
END CASE
其中,value表示条件判断的变量,WHEN后面的value表示变量的取值。如:
delimiter //
create procedure example_case(in x int)
begin
case x
when 1 then select 1;
when 2 then select 2;
else select 'other';
end case;
end
//
![运行结果](/assets/image-20221016102839389-PiFWnli-.png)
WHILE语句
WHILE语句执行时首先判断condition条件是否为真,如果为真则执行循环,否则退出循环。
WHILE语句的语法如下:
WHILE condition DO
...
END WHILE;
其中condition表示判断的条件。如
delimiter //
create procedure example_while(in x int)
begin
while x<=5 do
select x;
set x = x+1;
end while;
end
//
![运行结果](/assets/image-20221016103557713-mf5QPnUv.png)
LOOP 语句
LOOP语句没有循环条件,但是可以通过LEAVE语句退出循环。
LOOP语句的语法如下:
label:loop
...
end loop;
LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,中间省略的部分是要重复执行的语句,退出循环用LEAVE语句,语法为LEAVE label
。
如:
delimiter //
create procedure example_loop(in x int)
begin
label:loop
if x>5 then leave label;
end if;
select x;
set x = x+1;
end loop;
end
//
![运行结果](/assets/image-20221016104149786-Vz4IRBZu.png)
REPEAT语句
REPEAT语句是先执行一个循环体,之后判断condition条件是否为真,为真则退出循环,否则继续执行循环。
REPEAT语句的语法如下:
REPEAT
...
UNTIL condition
END REPEAT
如:
delimiter //
create procedure example_repeat(in x int)
begin
repeat
select x;
set x = x+1;
until x=5
end repeat;
end
//
![运行结果](/assets/image-20221016105522358-TlyZeyup.png)
在一个循环中继续循环
使用关键字ITERATE跳过本次循环,在LOOP,REPEAT和WHILE语句中很常用。使用ITERATE label
跳过本次循环。
如:
delimiter //
create procedure example_iterate(in x int)
begin
label:while x<5 do
set x = x+1;
select x;
if x=3 then iterate label;
end if;
end while;
end //
![运行结果](/assets/image-20221016110240756-74LxB3Qi.png)
终止循环:使用关键字LEAVE,语法是
leave label
,其中label表示为循环指定的标签。