mysql存儲(chǔ)過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析
本文實(shí)例講述了mysql存儲(chǔ)過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法。分享給大家供大家參考,具體如下:
MySQL提供循環(huán)語句,允許我們根據(jù)條件重復(fù)執(zhí)行一個(gè)SQL代碼塊其中有三個(gè)循環(huán)語句:WHILE,REPEAT和LOOP,我們接下來分別看下。首先是WHILE語句來看下語法:
WHILE expression DO statements END WHILE
WHILE循環(huán)在每次迭代開始時(shí)檢查表達(dá)式。 如果expressionevaluates為TRUE,MySQL將執(zhí)行WHILE和END WHILE之間的語句,直到expressionevaluates為FALSE。 WHILE循環(huán)稱為預(yù)先測試條件循環(huán),因?yàn)樗偸窃趫?zhí)行前檢查語句的表達(dá)式。來看下流程圖:
完事咱們嘗試在存儲(chǔ)過程中使用WHILE循環(huán)語句,看個(gè)實(shí)例:
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存儲(chǔ)過程中,它的操作是先來重復(fù)構(gòu)建str字符串,直到x變量的值大于5,完事使用select語句顯示最終的字符串。我們要注意的是,如果不初始化x變量的值,那么它默認(rèn)值為NULL。 因此,WHILE循環(huán)語句中的條件始終為TRUE,并且我們將有一個(gè)不確定的循環(huán),這是不可預(yù)料的。廢話不多說,我們先來調(diào)用test_mysql_while_loopstored存儲(chǔ)過程:
CALL test_mysql_while_loop();
執(zhí)行上面查詢語句,得到以下結(jié)果:
mysql> CALL test_mysql_while_loop(); +------------+ | str | +------------+ | 1,2,3,4,5, | +------------+ 1 row in set Query OK, 0 rows affected
完事再來看REPEAT循環(huán)語句的語法結(jié)構(gòu):
REPEAT statements; UNTIL expression END REPEAT
上述sql首先被mysql執(zhí)行,完事mysql會(huì)評(píng)估求值表達(dá)式(expression),如果表達(dá)式(expression)的計(jì)算結(jié)果為FALSE,則mysql將重復(fù)執(zhí)行該語句,直到該表達(dá)式計(jì)算結(jié)果為TRUE。因?yàn)镽EPEAT循環(huán)語句在執(zhí)行語句后檢查表達(dá)式(expression),因此REPEAT循環(huán)語句也稱為測試后循環(huán)。咱們來看下流程圖:
完事咱們再來使用REPEAT循環(huán)語句重寫test_mysql_while_loop存儲(chǔ)過程:
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表達(dá)式中沒有分號(hào)(;)。執(zhí)行上面查詢語句,得到以下結(jié)果:
mysql> CALL mysql_test_repeat_loop(); +------------+ | str | +------------+ | 1,2,3,4,5, | +------------+ 1 row in set Query OK, 0 rows affected
最后咱們再來看一個(gè)使用LOOP循環(huán)語句的示例:
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;
上述sql具體作用如下:
- 以上存儲(chǔ)過程僅構(gòu)造具有偶數(shù)字符串的字符串,例如2,4,6等。
- 在LOOP語句之前放置一個(gè)loop_label循環(huán)標(biāo)簽。
- 如果x的值大于10,則由于LEAVE語句,循環(huán)被終止。
- 如果x的值是一個(gè)奇數(shù),ITERATE語句忽略它下面的所有內(nèi)容,并開始一個(gè)新的迭代。
- 如果x的值是偶數(shù),則ELSE語句中的塊將使用偶數(shù)構(gòu)建字符串。
執(zhí)行上面查詢語句,得到以下結(jié)果:
mysql> CALL test_mysql_loop(); +-------------+ | str | +-------------+ | 2,4,6,8,10, | +-------------+ 1 row in set Query OK, 0 rows affected
完事咱們再來看下控制循環(huán)的兩個(gè)關(guān)鍵詞:
- LEAVE語句用于立即退出循環(huán),而無需等待檢查條件。LEAVE語句的工作原理就類似PHP,C/C++,java等其他語言的break語句一樣。
- ITERATE語句允許您跳過剩下的整個(gè)代碼并開始新的迭代。ITERATE語句類似于PHP,C/C++,Java等中的continue語句。
好啦,本次記錄就到這里了。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL存儲(chǔ)過程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
相關(guān)文章
MySQL中VARCHAR與CHAR格式數(shù)據(jù)的區(qū)別
char是一種固定長度的類型,varchar則是一種可變長度的類型,那么他們具體使用過程中有什么區(qū)別嗎2015-09-09在Debian 9系統(tǒng)上安裝Mysql數(shù)據(jù)庫的方法教程
這篇文章主要給大家介紹了在Debian 9系統(tǒng)上安裝Mysql數(shù)據(jù)庫的方法教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10連接MySQL出現(xiàn)Host is not allowed to con
這篇文章主要給大家介紹了連接MySQL出現(xiàn)Host is not allowed to connect to this MySQL server 解決方法,文中有詳細(xì)的解決步驟,需要的朋友可以參考下2023-08-08