在本教學中,將學習如何使用各種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迴圈語句。