流程控制语句用于根据条件控制语句的执行。MySQL中用于构造控制流程的语句有 IF 语句、CASE 语句、LOOP 语句、WHILE 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句。
1. IF 语句
IF 语句包含多个条件判断,根据判断的结果为 TRUE 或 FALSE 执行相应的语句,语法格式如下:
IF expr_condition THEN statement_list
[ ELSEIF expr_condition THEN statement_list ] ...
[ ELSE statement_list ]
END IF
IF 实现了一个基本的条件构造。如果 expr_condition 求值为真 (TRUE), 相应的 SQL 语句列表被执行; 如果没有 expr_condition 匹配,则 ELSE 子句里的语句列表被执行。statement_list 可以包括一个或多个语句。
【提示】 MySQL中还有一个 IF() 函数,它不同于 IF 语句。
【例】 IF语句的示例。代码如下:
IF val IS NULL
THEN select 'val is NULL' ;
ELSE SELECT 'val is not NULL' ;
END IF ;
2. CASE 语句
CASE 也是进行条件判断的语句,该语句有两种语句格式。
CASE语句的第 1 种格式如下:
CASE case_expr
WHEN when_value THEN statement_list
[ WHEN when_value THEN statement_list ] ...
[ ELSE statement_list ]
END CASE
其中,case_expr 参数表示条件判断的表达式,用于决定哪一个 WHEN 子句会被执行; when_value 参数表示表达式可能的值,如果某个 when_value 表达式与 case_expr 表达式结果相同,则执行对应 THEN 关键字后的 statement_list 中的语句; satement_list 参数表示和 when_value 值不同时的执行语句。
【例】使用 CASE 流程控制语句的第 1 种格式,判断 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;
CASE 语句的第 2 种格式如下:
CASE
WHEN expr_condition THEN statement_list
[ WHEN expr_condition THEN statement_list ] ...
[ ELSE statement_list ]
END CASE
expr_condition 参数表示条件判断语句; statement_list参数表示不同条件的执行语句。该语句中,WHEN 语句将被逐个执行,直到某个 expr_condition 表达式为真,则执行对应 THEN 关键字后面的 statement_list 语句。如果没有条件匹配,ELSE子句里的语句被执行.
【例】使用 CASE 流程控制语句的第 2 种格式,判断 val 是否为空、 小于0、大于 0 或者等于 0。 语句如下:
CASE
WHEN val IS NULL THEN SELECT 'val is NULL ' ;
WHEN val <0 THEN SELECT 'val is less than 0' ;
WHEN val > 0 THEN SELECT 'val is greater than 0 ' ;
ELSE SELECT 'val is 0' ;
END CASE;
3. loop 语句
LOOP 循环语句用来重复执行某些语句,与 IF 和 CASB 语句相比,LOOP 只是创建一个循环操作的过程,并不进行条件判断,LOOP 内的语句一直重复执行直到循环被退出,跳出循环过程。LOOP 语句的基本格式如下:
[ loop_label: ] LOOP
statement_list ;
END LOOP [ loop label ]
loop_label 表示 LOOP 语句的标注名称,该参数可以省略; statement_list 参数表示需要循环执行的语句。
【例】使用 LOOP 语句进行循环操作,id 值小于等于 10 之前,将重复执行循环过程。代码如下:
DECLARE id INT DEFAULT 0 ;
add_loop : LOOP
SET id = id + 1;
IF id >=10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
4. LEAVE 语句
LEAVE 语句用来退出任何被标注的流程控制构造,LEAVE 语句的基本格式如下:
LEAVE lable
其中,label 参数表示循环的标志。LEAVE 和 BEGIN... END 或循环 一起被使用。
【例】使用 LEAVE 语句退出循环。代码如下:
add_num: LOOP
SET @count = @count+1 ;
IF @count=50 THEN TEAVE add _num ;
END LOOP add_num
5. ITERATE 语句
ITERATE 语句将执行顺序转到语句段的开头,语句的基本格式如下:
ITERATE label
ITERATE 只可以出现在 LOOP、REPEAT 和 WHILE 语句内。ITERATE 的意思为“再次循环”,label 参数表示循环的标志。ITERATE 语句必须写在循环标志的前面。
【例】 ITERATE 语句示例。代码如下:
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
my_loop: LOOP
SET p1= p1 + 1;
IF p1 < 10 THEN ITERATE my_loop;
ELSEIF p1 > 20 THEN LEAVE my_loop;
END IF;
SELECT 'p1 is between 10 and 20';
END LOOP my_loop;
END
6. REPEAT 语句
REPEAT 语句创建一个带条件判断的循环过程,每次语句执行完毕之后,会对条件表达式进行判断,如果表达式为真,则循环结束 ; 否则重复执行循环中的语句。 REPEAT 语句的基本格式如下:
[ repeat_label: ] REPEAT
statement_list
UNTIL expr_condition
END REPEAT [ repeat_label ]
repeat_label 为 REPEAT 语句的标注名称,该参数可以省略; REPEAT 语句内的语句或语句群重复执行,直至 expr_condition 为真。
【例】 REPEAT语句示例,id 值小于10, 将重复执行循环过程。代码如下:
DECLARE id INT DEFAULT 0;
REPEAT
SET id = id + 1;
UNTIL id >= 10
END REPEAT;
7 WHILE 语句
WHILE 语句创建一个带条件判断的循环过程,与 REPEAT 不同,WHILE 语句在执行时,先对指定的表达式进行判断,如果为真,则执行循环内的语句,否则退出循环。WHLE 语句的基本格式如下:
[ while_label: ] WHILE expr_condition DO
statement_ list
END WHILE [ while_label ]
while_label 为 WHILE 语句的标注名称; expr_condition 为进行判断的表达式,如果表达式结果为真,WHILE 语句内的语句或语句群被执行,直至 expr_condition 为假,退出循环。
【例】WHILE 语句示例,id值小于10,将重复执行循环过程。代码如下:
DECLARE i INT DEFAULT 0;
WHILE i < 10 DO
SET i = i + 1;
END WHILE;
【注】参考于清华大学出版社《MySQL数据库应用案例课堂》2016年1月第1版