在本教學中,將學習如何使用各種MySQL迴圈語句(包括WHILE,REPEAT和LOOP)來根據條件反復運行代碼塊。
MySQL提供迴圈語句,允許您根據條件重複執行一個SQL代碼塊。 MySQL中有三個迴圈語句:WHILE,REPEAT和LOOP。
我們將在以下部分中更詳細地檢查每個迴圈語句。
WHILE迴圈
WHILE語句的語法如下:
WHILE expression DO
statements
END WHILE
WHILE迴圈在每次迭代開始時檢查運算式。 如果expressionevaluates為TRUE,MySQL將執行WHILE和END WHILE之間的語句,直到expressionevaluates為FALSE。 WHILE迴圈稱為預先測試條件迴圈,因為它總是在執行前檢查語句的運算式。
下麵的流程圖說明了WHILE迴圈語句:

以下是在存儲過程中使用WHILE迴圈語句的示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
WHILE x <= 5 DO
SET str = CONCAT(str,x,',');
SET x = x + 1;
END WHILE;
SELECT str;
END$$
DELIMITER ;
在上面的test_mysql_while_loop存儲過程中:
要注意,如果不初始化x變數的值,那麼它默認值為NULL。 因此,WHILE迴圈語句中的條件始終為TRUE,並且您將有一個不確定的迴圈,這是不可預料的。
下麵來測試test_mysql_while_loopstored調用存儲過程:
CALL test_mysql_while_loop();
執行上面查詢語句,得到以下結果 -
mysql> CALL test_mysql_while_loop();
+------------+
| str |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set
Query OK, 0 rows affected
REPEAT迴圈
REPEAT迴圈語句的語法如下:
REPEAT
statements;
UNTIL expression
END REPEAT
首先,MySQL執行語句,然後評估求值運算式(expression)。如果運算式(expression)的計算結果為FALSE,則MySQL將重複執行該語句,直到該運算式計算結果為TRUE。
因為REPEAT迴圈語句在執行語句後檢查運算式(expression),因此REPEAT迴圈語句也稱為測試後迴圈。
下麵的流程圖說明了REPEAT迴圈語句的執行過程:

我們可以使用REPEAT迴圈語句重寫test_mysql_while_loop存儲過程,使用WHILE迴圈語句:
DELIMITER $$
DROP PROCEDURE IF EXISTS mysql_test_repeat_loop$$
CREATE PROCEDURE mysql_test_repeat_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
REPEAT
SET str = CONCAT(str,x,',');
SET x = x + 1;
UNTIL x > 5
END REPEAT;
SELECT str;
END$$
DELIMITER ;
要注意的是UNTIL運算式中沒有分號(;)。
執行上面查詢語句,得到以下結果 -
mysql> CALL mysql_test_repeat_loop();
+------------+
| str |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set
Query OK, 0 rows affected
LOOP,LEAVE和ITERATE語句
有兩個語句允許您用於控制迴圈:
LEAVE語句用於立即退出迴圈,而無需等待檢查條件。LEAVE語句的工作原理就類似PHP,C/C++,Java等其他語言的break語句一樣。ITERATE語句允許您跳過剩下的整個代碼並開始新的迭代。ITERATE語句類似於PHP,C/C++,Java等中的continue語句。
MySQL還有一個LOOP語句,它可以反復執行一個代碼塊,另外還有一個使用迴圈標籤的靈活性。
以下是使用LOOP迴圈語句的示例。
CREATE PROCEDURE test_mysql_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF;
SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
SET str = CONCAT(str,x,',');
END IF;
END LOOP;
SELECT str;
END;
- 以上存儲過程僅構造具有偶數字串的字串,例如
2,4,6等。 - 在
LOOP語句之前放置一個loop_label迴圈標籤。 - 如果
x的值大於10,則由於LEAVE語句,迴圈被終止。 - 如果
x的值是一個奇數,ITERATE語句忽略它下麵的所有內容,並開始一個新的迭代。 - 如果
x的值是偶數,則ELSE語句中的塊將使用偶數構建字串。
執行上面查詢語句,得到以下結果 -
mysql> CALL test_mysql_loop();
+-------------+
| str |
+-------------+
| 2,4,6,8,10, |
+-------------+
1 row in set
Query OK, 0 rows affected
在本教學中,您學習了基於條件重複執行代碼塊的各種MySQL迴圈語句。
