在MySQL中,流程控制语句,用于将多个SQL语句,划分或组成成符合业务逻辑的代码块。其中包括IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句和REPEAT语句,它们可以进行流程控制。每个流程中,可能包含一个单独语句,也可以是使用BEGIN……END构造的复合语句,可以嵌套。
IF语句用来进行条件判断,根据不同的条件执行不同的操作。该语句在执行时首先判断IF后的条件是否为真,则执行THEN后的语句,如果为假则继续判断IF语句直到为真为止,当以上都不满足时则执行ELSE语句后的内容。IF语句表示形式:
IF condition THEN
statement_list ...
[ELSEIF condition THEN]
statement_list ...
[ELSE]
statement_list ...
END IF
参数说明:condition,表示判断条件 ;
statement_list...,表示SQL语句列表,它可以包括一个或多个语句;
注意,MySQL中还有一个IF()函数,不同于这里的IF语句
IF val IS NULL
THEN SELECT ‘val is NULL’
ELSE SELECT ‘val is not NULL’
END IF
判断val值是否为空 ,如果,val值为空,输出字符串val is NULL,否则,输出字符串val is not NULL ;
注意,IF语句都需要使用END IF来结束,不可省略。
case语句为多分支语句结构,该语句首先从when后的value中查找与case后的value相等的值,如果查找到则执行该分支的内容,否则执行else后的内容。CASE语句表达形式:
第一种格式
CASE case_value
WHERE when_value THEN statement_list...
[WHERE when_value THEN statement_list...]
[ELSE statement_list...]
END CASE
参数说明:case_value:表示条件判断的表达式,决定了哪一个WHEN自己会被执行 ;
When_value:表示表达式可能的值,如果,某个when_value表达式与case_value表达式结果相同,则执行对应THEN关键字后的statement_list中的语句 ;
statement_list:表示不同when_value值的执行语句;
使用CASE流程控制语句,第一种格式,判断val值等于1、等于2,或者两者都不等于
CASE val
WHEN 1 THEN SELECT ‘val is 1’;
WHEN 2 THEN SELECT ‘val is 2’;
ELSE SELECT ‘val is not 1 or 2’;
END CASE;
当val值为1时,输出字符串val is 1
当val值为2时,输出字符串val is 2
否则,输出字符串val is not 1 or 2
第二种格式
CASE
WHEN condition THEN statement_list ...
[WHEN condition THEN statement_list...]
[ELSE statement_list...]
END CASE
注意:这里存储过程中的CASE语句,与控制流程函数中的SQL CASE表达式中的CASE是不同的 ;
存储过程中,CASE语句不能有ELSE NULL子句,并且,用END CASE代替END来终止。
WHILE在语句执行时,先对指定的条件进行判断,如果为真,则执行循环内的语句,否则退出循环。WHILE循环语句表达形式:
[while_lable:] WHILE condition DO
statement_list...
END WHILE [while_lable]
参数说明:While_lable:为WHILE语句的标注名称 ;
condition:为进行判断的表达式,如果表达式为真,WHILE语句内的语句,或语句群就被执行,直至expr_condition为假,退出循环;
使用WHILE语句,进行循环操作
delimiter //
create procedure example_while (out sum int)
begin
declare i int default 1;
declare s int default 0;
while i<=100 do
set s=s+i;
set i=i+1;
end while;
set sum=s;
end
//
LOOP循环语句,用来重复执行某些语句 ,该循环没有内置的循环条件,但可以借助于leave语句退出循环。LOOP循环语句表达形式:
[begin_lable:]loop
statement_list
end loop[end_lable]
begin_lable和end_lable参数分别表示开始和结束的标志,必须相同,且可省略。
每次语句先执行一次完毕之后,会对条件表达式进行判断,如果表达式为真,则循环结束,否则,重复执行循环中的语句。REPEAT循环语句表达形式:
[repeat_lable:]repeat
statement_list...
until condition
end repeat[repeat_lable]
参数说明:repeat_lable:为repeat语句的标注名称,该参数是可选的 ;
repeat语句内的语句或语句群被重复,直至condition为真;
用于退出任何被标注的流程控制结构,LEAVE语句表达形式:
LEAVE label
参数说明:label表示循环的标志 ;通常情况下,LEAVE语句与BEGIN……END、循环语句一起使用。
用于将执行顺序转到语句段的开头处,ITERATE语句表达形式:
ITERATE lable
参数说明:Lable,表示循环的标志
注意,ITERATE语句只可以出现在LOOP、REPEAT和WHILE语句中。
该语句的格式与LEAVE大同小异,区别在于:LEAVE语句是离开一个循环,而ITERATE语句是重新开始一个循环。