MySQL流程控制语句汇总(IF、CASE、LOOP、LEAVE、ITERATE、REPEAT和WHILE)
流程控制语句用来根据条件控制语句的执行。MySQL 中用来构造控制流程的语句有 IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句。
每个流程中可能包含一个单独语句,或者是使用 BEGIN...END 构造的复合语句,构造可以被嵌套。
MySQL 中还有一个 IF() 函数,不同于这里描述的 IF 语句。
【实例】IF 语句的示例,代码如下:
第 1 种格式如下:
【实例】使用 CASE 流程控制语句的第 1 种格式,判断 val 值等于 1、等于 2,或者两者都不等,语句如下:
CASE 语句的第 2 种格式如下:
这里介绍的用在存储程序里的 CASE 语句与“控制流程函数”里描述的 SQL CASE 表达式的 CASE 语句稍微有点不同。这里的 CASE 语句不能有 ELSE NULL 子句,并且用 END CASE 替代 END 来终止。
【实例】使用 CASE 流程控制语句的第 2 种格式,判断 val 是否为空、小于 0、大于 0 或者等于 0,语句如下:
LOOP 内的语句一直重复执行直到循环被退出(使用 LEAVE 子句),跳出循环过程。LOOP 语句的基本格式如下:
【实例】使用 LOOP 语句进行循环操作,id 值小于 10 时将重复执行循环过程,代码如下:
【实例】使用 LEAVE 语句退出循环,代码如下:
【实例】ITERATE 语句示例,代码如下:
REPEAT 语句的基本格式如下:
【实例】REPEAT 语句示例,id 值小于 10 时将重复执行循环过程,代码如下:
WHILE 语句的基本格式如下:
【实例】WHILE 语句示例,i 值小于 10 时,将重复执行循环过程,代码如下:
每个流程中可能包含一个单独语句,或者是使用 BEGIN...END 构造的复合语句,构造可以被嵌套。
MySQL IF语句
IF 语句包含多个条件判断,根据判断的结果为 TRUE 或 FALSE 执行相应的语句,语法格式如下:IF expr_condition THEN statement_list [ELSEIF expr_condition THEN statement_list] ... [ELSE statement_list] END IFIF 实现了一个基本的条件构造。如果 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;该示例判断 val 值是否为空,如果 val 值为空,则输出字符串“val is NULL”,否则输出字符串“val is not NULL”。IF 语句都需要使用 END IF 来结束。
MySQL 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 中的语句;
- statement_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;当 val 值为 1 时,输出字符串“val is 1”;当 val 值为 2 时,输出字符串“val is 2”;否则,输出字符串“val is not 1 or 2”。
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 语句与“控制流程函数”里描述的 SQL CASE 表达式的 CASE 语句稍微有点不同。这里的 CASE 语句不能有 ELSE NULL 子句,并且用 END CASE 替代 END 来终止。
【实例】使用 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;当 val 值为空,输出字符串“val is NULL”;当 val 值小于 0 时,输出字符串“val is less than 0”;当 val 值大于 0 时,输出字符串“val is greater than 0”;否则,输出字符串“val is 0”。
MySQL LOOP语句
LOOP 循环语句用来重复执行某些语句,与 IF 和 CASE 语句相比,LOOP 只是创建一个循环操作的过程,并不进行条件判断。LOOP 内的语句一直重复执行直到循环被退出(使用 LEAVE 子句),跳出循环过程。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;该示例循环执行 id 加 1 的操作。当 id 值小于 10 时,循环重复执行;当 id 值大于或者等于 10 时,使用 LEAVE 语句退出循环。LOOP 循环都以 END LOOP 结束。
MySQL LEAVE语句
LEAVE 语句用来退出任何被标注的流程控制构造,基本格式如下:LEAVE label其中,label 参数表示循环的标志。LEAVE 和 BEGIN ... END 或循环一起被使用。
【实例】使用 LEAVE 语句退出循环,代码如下:
add_num: LOOP SET @count=@count+1; IF @count=50 THEN LEAVE add_num ; END LOOP add_num ;该示例循环执行 count 加 1 的操作。当 count 的值等于 50 时,使用 LEAVE 语句跳出循环。
MySQL ITERATE语句
ITERATE 语句将执行顺序转到语句段开头处,语句基本格式如下:ITERATE labelITERATE 只可以出现在 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初始化 p1=0,如果 p1 的值小于 10 时,重复执行 p1 加 1 操作;当 p1 大于等于 10 并且小于等于 20 时,打印消息“p1 is between 10 and 20”;当 p1 大于 20 时,退出循环。
MySQL 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;该示例循环执行 id 加 1 的操作。当 id 值小于 10 时,循环重复执行;当 id 值大于或者等于 10 时,退出循环。REPEAT 循环都以 END REPEAT 结束。
MySQL WHILE语句
WHILE 语句创建一个带条件判断的循环过程,与 REPEAT 不同,WHILE 在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。WHILE 语句的基本格式如下:
[while_label:] WHILE expr_condition DO statement_list END WHILE [while_label]while_label 为 WHILE 语句的标注名称;expr_condition 为进行判断的表达式,如果表达式结果为真,WHILE 语句内的语句或语句群被执行,直至 expr_condition 为假,退出循环。
【实例】WHILE 语句示例,i 值小于 10 时,将重复执行循环过程,代码如下:
DECLARE i INT DEFAULT 0; WHILE i < 10 DO SET i = i + 1; END WHILE;