本文简单介绍在MySQL中如何使用控制流程语句进行流程控制
目录
MySQL支持的控制流程语句
MySQL数据库支持使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句进行流程的控制。
使用IF语句
语法说明
IF语句能够根据条件判断的结果为TRUE或者FALSE来执行相应的逻辑。
IF语句的语法格式如下:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
简单示例
创建存储过程
创建一个名称为CompareNumber的存储过程,在存储过程中定义一个INT类型的变量x,并为变量x赋值200。接下来,使用IF语句对x的值进行判断,如果x的值小于200,则输出“x < 200”;如果x的值等于200,则输出“x = 200”;如果x的值大于200,则输出“x >200”。
在MySQL命令行中执行代码:
mysql>DELIMITER $$
mysql> CREATE PROCEDURE CompareNumber()
BEGIN
DECLARE x INT DEFAULT 0;
SET x = 200;
IF x < 200 THEN
SELECT 'x < 200';
ELSEIF x = 200 THEN
SELECT 'x = 200';
ELSE
SELECT 'x > 200';
END IF;
END $$
Query OK, 0 rows affected (0.13 sec)
mysql> DELIMITER;
调用存储过程
在MySQL命令行中调用名称为CompareNumber的存储过程。
mysql> CALL CompareNumber();
+---------+
| x = 200 |
+---------+
| x = 200 |
+---------+
1 row in set (0.04 sec)
Query OK, 0 rows affected (0.00 sec)
在CompareNumber的存储过程中,为变量x赋值100,通过IF语句判断,输出了“x = 100”。
删除存储过程
删除创建的存储过程,在MySQL命令行中执行以下代码:
mysql> DROP PROCEDURE CompareNumber;
Query OK, 0 rows affected (0.07 sec)
使用CASE语句
语法说明
CASE语句有两种语法格式。
语法格式1
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
其中,case_value表示条件表达式,根据case_value的值,执行相应的WHEN语句。when_value为case_value可能的值,如果某个when_value的值与case_value的值相同,则会执行当前when_value对应的THEN后面的statement_list语句;如果没有when_value的值与case_value的值相同,则执行ELSE语句对应的statement_list语句。
语法格式2
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
其中,search_condition为条件判断语句,当某个search_condition语句为TRUE时,执行对应的THEN后面的statement_list语句;如果search_condition语句都为FALSE,则执行ELSE对应的statement_list语句。
简单示例
创建存储过程1
创建名称为CompareNumberWithCaseValue的存储过程,
使用CASE语句语法格式1,对变量x的值进行判断,并输出相应的信息。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql> CREATE PROCEDURE CompareNumberWithCaseValue()
BEGIN
DECLARE x INT DEFAULT 0;
SET x = 200;
CASE x
WHEN 0 THEN SELECT 'x = 0';
WHEN 200 THEN SELECT 'x = 200';
ELSE SELECT 'x <> 0 and x <> 200';
END CASE;
END $$
Query OK, 0 rows affected (0.03 sec)
mysql> DELIMITER;
调用存储过程1
名称为CompareNumberWithCaseValue的存储过程创建成功。接下来,在MySQL命令行中调用名称为CompareNumberWithCaseValue的存储过程。
mysql> CALL CompareNumberWithCaseValue();
+---------+
| x = 200 |
+---------+
| x = 200 |
+---------+
1 row in set (0.06 sec)
Query OK, 0 rows affected (0.00 sec)
在存储过程CompareNumberWithCaseValue中,将变量x设置为100,根据CASE语句条件的判断,输出了“x = 100”的信息。
创建存储过程2
创建名称为CompareNumberWithCase的存储过程,使用CASE语句语法格式2,对变量x的值进行判断并输出相应的信息。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql> CREATE PROCEDURE CompareNumberWithCase()
BEGIN
DECLARE x INT DEFAULT 0;
SET x = 200;
CASE
WHEN x < 200 THEN SELECT 'x < 200';
WHEN x = 200 THEN SELECT 'x = 200';
WHEN x > 200 THEN SELECT 'x > 200';
ELSE SELECT 'x NOT FOUND';
END CASE;
END $$
Query OK, 0 rows affected (0.04 sec)
mysql> DELIMITER;
调用存储过程2
名称为CompareNumberWithCase的存储过程创建成功。
在MySQL命令行中调用名称为CompareNumberWithCase的存储过程。
mysql> CALL CompareNumberWithCase();
+---------+
| x = 200 |
+---------+
| x = 200 |
+---------+
1 row in set (0.05 sec)
Query OK, 0 rows affected (0.00 sec)
名称为CompareNumberWithCase的存储过程同样输出了“x = 100”的信息。
删除存储过程
删除上述创建的两个存储过程,命令如下:
mysql> DROP PROCEDURE CompareNumberWithCaseValue;
Query OK, 0 rows affected (0.07 sec)
mysql> DROP PROCEDURE CompareNumberWithCase;
Query OK, 0 rows affected (0.05 sec)
使用LOOP语句
LOOP语句能够循环执行某些语句,而不进行条件判断,
可以使用LEAVE语句退出LOOP循环。
语法说明
LOOP语句的语法格式如下:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
其中,begin_label和end_label都是LOOP语句的标注名称,该参数可以省略。
如果begin_label和end_label两者都出现,则它们必须是相同的。
简单示例
创建存储过程
创建名称为HandlerDataWithLoop的存储过程,在存储过程中定义INT类型的变量x,默认值为0,使用LOOP语句为x变量循环加1,当x变量的值大于等于200时,退出LOOP循环,最后输出x的值。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql> CREATE PROCEDURE HandlerDataWithLoop()
BEGIN
DECLARE x INT DEFAULT 0;
x_loop: LOOP
SET x = x + 1;
IF x >= 200 THEN
LEAVE x_loop;
END IF;
END LOOP x_loop;
SELECT x;
END $$
Query OK, 0 rows affected (0.05 sec)
mysql> DELIMITER;
名称为HandlerDataWithLoop的存储过程创建成功。
调用存储过程
在MySQL命令行中调用名称为HandlerDataWithLoop的存储过程。
mysql> CALL HandlerDataWithLoop();
+-----+
| x |
+-----+
| 200 |
+-----+
1 row in set (0.04 sec)
Query OK, 0 rows affected (0.00 sec)
删除存储过程
删除上述创建的存储过程,命令如下:
mysql> DROP PROCEDURE HandlerDataWithLoop;
Query OK, 0 rows affected (0.09 sec)
使用LEAVE语句
语法说明
LEAVE语句能够从被标注的流程结果中退出,语法结构如下:
LEAVE label
其中,label表示被标注的流程标志。
简单示例
参见LOOP语句控制流程中的简单示例,这里不再赘述。
使用ITERATE语句
语法说明
ITERATE语句表示跳过本次循环,而执行下次循环操作。
语法格式如下:
ITERATE label
其中,label表示被标注的流程标志。
注意:ITERATE只可以出现在LOOP、REPEAT和WHILE语句内。
简单示例
创建存储过程
创建名称为HandlerDataWithIterate的存储过程,
在存储过程中定义INT类型的变量x,默认值为0。
接下来,在LOOP循环中为变量x加1,当x的值小于5时,执行ITERATE操作;
当x的值大于等于8时,退出LOOP循环;其他情况,打印x变量的值。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql> CREATE PROCEDURE HandlerDataWithIterate()
BEGIN
DECLARE x INT DEFAULT 0;
x_loop: LOOP
SET x = x + 1;
IF x < 5 THEN ITERATE x_loop;
ELSEIF x >= 8 THEN LEAVE x_loop;
END IF;
SELECT x;
END LOOP x_loop;
END $$
Query OK, 0 rows affected (0.11 sec)
mysql> DELIMITER ;
调用存储过程
在MySQL命令行中调用名称为HandlerDataWithIterate的存储过程。
mysql> CALL HandlerDataWithIterate();
+---+
| x |
+---+
| 5 |
+---+
1 row in set (0.02 sec)
+---+
| x |
+---+
| 6 |
+---+
1 row in set (0.05 sec)
+---+
| x |
+---+
| 7 |
+---+
1 row in set (0.08 sec)
Query OK, 0 rows affected (0.00 sec)
当x变量的值大于等于5且小于8时,输出了x变量的值。
删除存储过程
删除上述创建的存储过程,在MySQL命令行执行以下代码:
mysql> DROP PROCEDURE HandlerDataWithIterate;
Query OK, 0 rows affected (0.05 sec)
使用REPEAT语句
语法说明
REPEAT语句会创建一个带有条件判断的循环语句,
每次执行循环体时,都会对条件进行判断,如果条件判断为TRUE,则退出循环,
否则继续执行循环体,语法格式如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
其中begin_label和end_label为循环的标志,二者可以省略,如二者同时出现,则必须相同。当search_condition条件判断为TRUE时,退出循环。
简单示例
创建存储过程
创建名称为HandlerDataWithRepeat的存储过程,在存储过程中定义INT类型的变量x,默认值为0。在REPEAT循环中为x变量加1,如果x变量的值大于等于10,则退出REPEAT循环,最后打印x变量的值。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql>CREATE PROCEDURE HandlerDataWithRepeat()
BEGIN
DECLARE x INT DEFAULT 0;
x_repeat: REPEAT
SET x = x + 1;
UNTIL x >= 10
END REPEAT x_repeat;
SELECT x;
END $$
Query OK, 0 rows affected (0.06 sec)
mysql> DELIMITER ;
调用存储过程
在MySQL命令行中调用名称为HandlerDataWithRepeat的存储过程。
mysql> CALL HandlerDataWithRepeat();
+----+
| x |
+----+
| 10 |
+----+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.00 sec)
存储过程通过REPEAT循环处理,正确地输出了x变量的值。
删除存储过程
删除上述创建的存储过程,在MySQL命令行中执行以下代码:
mysql> DROP PROCEDURE HandlerDataWithRepeat;
Query OK, 0 rows affected (0.10 sec)
使用WHILE语句
语法说明
WHILE语句同样可以创建一个带有条件判断的循环语句。
与REPEAT语句不同,WHILE语句的条件判断为TRUE时,继续执行循环体。
语法格式如下:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
其中begin_label和end_label为循环的标志,二者可以省略,如二者同时出现,则必须相同。当search_condition条件判断为TRUE时,继续执行循环体。
简单示例
创建存储过程
创建一个名称为HandlerDataWithWhile的存储过程,
在存储过程中定义一个INT类型的变量x,默认值为0。
当x的值小于10时,使用WHILE循环对x变量的值加1,最后打印x变量的值。
在MySQL命令行中执行代码:
mysql> DELIMITER $$
mysql> CREATE PROCEDURE HandlerDataWithWhile()
BEGIN
DECLARE x INT DEFAULT 0;
x_while: WHILE x < 10 DO
SET x = x + 1;
END WHILE x_while;
SELECT x;
END $$
Query OK, 0 rows affected (0.09 sec)
mysql> DELIMITER ;
名称为HandlerDataWithWhile的存储过程创建成功。
调用存储过程
在MySQL命令行中调用名称为HandlerDataWithWhile的存储过程。
mysql> CALL HandlerDataWithWhile();
+----+
| x |
+----+
| 10 |
+----+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.00 sec)
在存储过程中通过WHILE循环对x变量的值进行处理,并正确输出了x变量的值。
删除存储过程
删除上述创建的存储过程,在MySQL命令行中执行以下代码:
mysql> DROP PROCEDURE HandlerDataWithWhile;
Query OK, 0 rows affected (0.09 sec)
总结
本文简单介绍在MySQL中如何使用控制流程语句进行流程控制

被折叠的 条评论
为什么被折叠?



