MySQL流程控制语句

在MySQL中,常见的过程式SQL语句能够用在一个存储过程体中。其中包括:IF语句、CASE语句、LOOP语句、WHILE语句、REPEAT语句、LEAVE语句和ITERATE语句,它们能够进行流程控制。sql

一、IF语句

IF语句用来进行条件判断,根据不一样的条件执行不一样的操做。该语句在执行时首先判断IF后的条件是否为真,则执行THEN后的语句,若是为假则继续判断IF语句直到为真为止,当以上都不知足时则执行ELSE语句后的内容。IF语句表示形式以下:oop

IF condition THEN
	...
ELSE condition THEN
	...
ELSE
	...
END IF

示例:使用IF语句用来进行条件判断。code

-- 建立存储过程
CREATE PROCEDURE example_if (IN x INT)
BEGIN
	IF x = 1 THEN
		SELECT 1;
	ELSEIF x = 2 THEN 
		SELECT 2;
	ELSE
		SELECT 3;
	END IF;
END;

-- 调用存储过程
CALL example_if(2);

二、CASE语句

CASE语句为多分支语句结构,该语句首先从WHEN后的VALUE中查找与CASE后的VALUE相等的值,若是查找到则执行该分支的内容,不然执行ELSE后的内容。CASE语句表示形式以下:it

CASE value
	WHEN value THEN ...
	WHEN value THEN ...
	ELSE ...
END CASE

CASE语句另外一种语法表示形式以下:io

CASE
	WHEN value THEN ...
	WHEN value THEN ...
	ELSE ...
END CASE

示例:使用CASE语句用来进行条件判断。class

-- 建立存储过程
CREATE PROCEDURE example_case(IN x INT)
BEGIN
	CASE x
		WHEN 1 THEN SELECT 1;
		WHEN 2 THEN SELECT 2;
		ELSE SELECT 3;
	END CASE;
END;

-- 调用存储过程
CALL example_case(5);

三、WHILE循环语句

WHILE循环语句执行时首先判断condition条件是否为真,若是是则执行循环体,不然退出循环。该语法表示形式以下:循环

WHILE condition DO
...
END WHILE;

示例:使用WHILE循环语句执行求前100的和。语法

-- 建立存储过程
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;

-- 调用存储过程
CALL example_while(@sum);
SELECT @sum;

四、LOOP循环语句

LOOP循环没有内置的循环条件,但能够经过LEAVE语句退出循环。LOOP语句表示形式以下:存储过程

LOOP
	...
END LOOP

LOOP语句容许某特定语句或语句群的重复执行,实现一个简单的循环构造,在循环内的语句一直重复直至循环被退出,退出循环应用LEAVE语句。di

LEAVE语句常常和BEGIN...END或者循环一块儿使用,其表示形式以下:

LEAVE label

label是语句中标注的名字,这个名字是自定义的。

示例:使用LOOP循环语句求前100的和。

-- 建立存储过程
CREATE PROCEDURE example_loop(OUT sum INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE s INT DEFAULT 0;
	
	loop_label:LOOP
		SET s = s+i;
		SET i = i+1;
	
		IF i>100 THEN
			-- 退出LOOP循环
			LEAVE loop_label;  
		END IF;
	END LOOP;

	SET sum = s;
END;

-- 调用存储过程
CALL example_loop(@sum);
SELECT @sum;

五、REPEAT循环语句

REPEAT循环语句先执行一次循环体,以后判断condition条件是否为真,则退出循环,不然继续执行循环。REPEAT语句表示形式以下:

REPEAT
	...
	UNTIL condition
END REPEAT

示例:使用REPEAT循环语句求前100的和。

-- 建立存储过程
CREATE PROCEDURE example_repeat(OUT sum INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE s INT DEFAULT 0;

	REPEAT
		SET s = s+i;
		SET i = i+1;
		
		UNTIL i > 100
	END REPEAT;
	
	SET sum = s;
END;

-- 调用存储过程
CALL example_repeat(@sum);
SELECT @sum;

六、ITERATE语句

ITERATE语句能够出如今LOOP、REPEAT和WHILE语句内,其意为“再次循环”。语句格式以下:

ITERATE label

该语句的格式与LEAVE大同小异,区别在于:LEAVE语句是离开一个循环,而ITERATE语句是从新开始一个循环。

示例:求10之内奇数值的和。

-- 建立存储过程
CREATE PROCEDURE example_iterate(OUT sum INT)
BEGIN
	DECLARE i INT DEFAULT 0;
	DECLARE s INT DEFAULT 0;
	
	loop_label:LOOP

		SET i = i+1;		

		IF i > 10 THEN
			-- 退出整个循环
			LEAVE loop_label;  
		END IF;

		IF (i mod 2) THEN
			SET s = s+i;
		ELSE
			-- 退出本次循环,继续下一个循环
			ITERATE  loop_label;
		END IF;

	END LOOP;

	SET sum = s;
END;

-- 调用存储过程
CALL example_iterate(@sum);
SELECT @sum;