MySQL流程控制的使用
流程控制語(yǔ)句,用于將多個(gè)SQL語(yǔ)句,劃分或組成成符合業(yè)務(wù)邏輯的代碼塊
流程控制語(yǔ)句
包括,IF語(yǔ)句、CASE語(yǔ)句、LOOP語(yǔ)句、WHILE語(yǔ)句、LEAVE語(yǔ)句、ITERATE語(yǔ)句、REPEAT語(yǔ)句和WHILE語(yǔ)句
每個(gè)流程中,可能包含一個(gè)單獨(dú)語(yǔ)句,也可以是使用BEGIN……END構(gòu)造的復(fù)合語(yǔ)句,可以嵌套
IF語(yǔ)句
IF語(yǔ)句,是指如果滿足某種條件,根據(jù)判斷的結(jié)果為TRUE,或者FALSE執(zhí)行相應(yīng)的語(yǔ)句
語(yǔ)法格式
IF expr_condition THEN statement_list
[ELSEIF expr_condition THEN statement_list]
[ELSE statement_list]
END IF
IF實(shí)現(xiàn)了一個(gè)基本的條件構(gòu)造
參數(shù)說明
Expr_condition,表示判斷條件
Statement_list,表示SQL語(yǔ)句列表,它可以包括一個(gè)或多個(gè)語(yǔ)句
如果,expr_condition求值為TRUE,相應(yīng)的SQL語(yǔ)句列表就會(huì)被執(zhí)行,如果,沒有expr_condition匹配,則ELSE子句李的語(yǔ)句列表被執(zhí)行
注意,MySQL中還有一個(gè)IF()函數(shù),不同于這里的IF語(yǔ)句
IF val IS NULL
THEN SELECT ‘val is NULL’;
ELSE SELECT ‘val is not NULL’;
END IF;
判斷val值是否為空
如果,val值為空,輸出字符串val is NULL,否則,輸出字符串val is not NULL
注意,IF語(yǔ)句都需要使用END IF來結(jié)束,不可省略
CASE語(yǔ)句
另一個(gè)進(jìn)行條件判斷的語(yǔ)句,該語(yǔ)句有兩種語(yǔ)句格式
第一種格式
CASE case_expr
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]……
[ELSE statement_list]
END CASE
參數(shù)說明
Case_expr,表示條件判斷的表達(dá)式,決定了哪一個(gè)WHEN自己會(huì)被執(zhí)行
When_value,表示表達(dá)式可能的值,如果,某個(gè)when_value表達(dá)式與case_expr表達(dá)式結(jié)果相同,則執(zhí)行對(duì)應(yīng)THEN關(guān)鍵字后的statement中的語(yǔ)句
Statement_list,表示不同when_value值的執(zhí)行語(yǔ)句
使用CASE流程控制語(yǔ)句,第一種格式,判斷val值等于1、等于2,或者兩者都不等于
CASE val
WHEN 1 THEN SELECT ‘val is 1’;
WHEN 2 THEN SELECT ‘val is 2’;
ELSE SELECT ‘val is not 1 or 2’;
END CASE;
當(dāng)val值為1時(shí),輸出字符串val is 1
當(dāng)val值為2時(shí),輸出字符串val is 2
否則,輸出字符串val is not 1 or 2
第二種格式
CASE
WHEN expr_condition THEN statement_list
[WHEN expr_condition THEN statement_list]
[ELSE statement_list]
END CASE;
注意,這里存儲(chǔ)過程中的CASE語(yǔ)句,與控制流程函數(shù)中的SQL CASE表達(dá)式中的CASE是不同的
存儲(chǔ)過程中,CASE語(yǔ)句不能有ELSE NULL子句,并且,用END CASE代替END來終止
LOOP語(yǔ)句
LOOP循環(huán)語(yǔ)句,用來重復(fù)執(zhí)行某些語(yǔ)句
與IF和CASE語(yǔ)句相比,LOOP只是創(chuàng)建一個(gè)循環(huán)操作的過程,并不進(jìn)行條件判斷
LOOP內(nèi)的語(yǔ)句一直重復(fù)執(zhí)行,知道跳出循環(huán)語(yǔ)句
語(yǔ)法格式
[loop_label:] LOOP
Statement_list
END LOOP [loop_label]
參數(shù)說明
Loop_label,表示LOOP語(yǔ)句的標(biāo)注名稱,該參數(shù)可以省略
Statement,表示需要循環(huán)執(zhí)行的語(yǔ)句
使用LOOP 語(yǔ)句進(jìn)行循環(huán)操作
DECLARE id INT DEFAULT 0;
Add_loop:LOOP
SET id=id+1;
IF id>=10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
循環(huán)執(zhí)行了id加1的操作
當(dāng)id值小于10時(shí),循環(huán)重復(fù)執(zhí)行,當(dāng)id值大于或者等于10時(shí),使用LEAVE語(yǔ)句退出循環(huán)
LEAVE語(yǔ)句
用于退出任何被標(biāo)注的流程控制結(jié)構(gòu)
語(yǔ)法格式
LEAVE label
參數(shù)說明
label,表示循環(huán)的標(biāo)志
通常情況下,LEAVE語(yǔ)句與BEGIN……END、循環(huán)語(yǔ)句一起使用
ITERATE,意思是再次循環(huán)
ITERATE語(yǔ)句
用于將執(zhí)行順序轉(zhuǎn)到語(yǔ)句段的開頭處
語(yǔ)法格式
ITERATE lable
參數(shù)說明
Lable,表示循環(huán)的標(biāo)志
注意,ITERATE語(yǔ)句只可以出現(xiàn)在,LOOP、REPEAT和WHILE語(yǔ)句中
演示ITERATE語(yǔ)句,在LOOP語(yǔ)句內(nèi)的使用
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
My_loop:LOOP
SET p1=p1+1;
IF p1<10 THEN ITERATE my_loop;
ELSEIF p1>20 THEN LEAVE my_loop;
END IF;
SELECT ‘p1 is between 10 and 20’;
END LOOP my_loop;
END
P1的初始值為0,如果,p1的值小于10時(shí),重復(fù)執(zhí)行p1加1的操作,當(dāng)p1大于或等于10,并且小于20時(shí),打印消息p1 is between 10 and 20,當(dāng)p1大于20時(shí),退出循環(huán)
REPEAT語(yǔ)句
用于創(chuàng)建一個(gè)帶有條件判斷的循環(huán)過程
每次語(yǔ)句執(zhí)行完畢之后,會(huì)對(duì)條件表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則循環(huán)結(jié)束,否則,重復(fù)執(zhí)行循環(huán)中的語(yǔ)句
語(yǔ)法格式
[repeat_lable:] REPEAT
Statement_list
UNTIL expr_condition
END REPEAT [repeat_lable]
參數(shù)說明
Repeat_lable,為REPEAT語(yǔ)句的標(biāo)注名稱,該參數(shù)是可選的
REPEAT語(yǔ)句內(nèi)的語(yǔ)句,或語(yǔ)句群被重復(fù),直至expr_condition為真
使用REPEAT語(yǔ)句,執(zhí)行循環(huán)過程
DECLARE id INT DEFAULT 0;
REPEAT
SET id=id+1;
UNTIL id>=10;
END REPEAT;
WHILE語(yǔ)句
創(chuàng)建一個(gè)帶條件判斷的循環(huán)過程
與REPEAT不同的是,WHILE在語(yǔ)句執(zhí)行時(shí),先對(duì)指定的條件進(jìn)行判斷,如果為真,則執(zhí)行循環(huán)內(nèi)的語(yǔ)句,否則退出循環(huán)
語(yǔ)法格式
[while_lable:] WHILE expr_condition DO
Statement_list
END WHILE [while_lable]
參數(shù)說明
While_lable,為WHILE語(yǔ)句的標(biāo)注名稱
Expr_condition,為進(jìn)行判斷的表達(dá)式,如果表達(dá)式為真,WHILE語(yǔ)句內(nèi)的語(yǔ)句,或語(yǔ)句群就被執(zhí)行,直至expr_condition為假,退出循環(huán)
使用WHILE語(yǔ)句,進(jìn)行循環(huán)操作
DECLARE i INT DEFAULT 0;
WHILE i<10 DO
SET i=i+1;
END WHILE;
總結(jié)
以上是生活随笔為你收集整理的MySQL流程控制的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL光标的使用
- 下一篇: MySQL调用存储过程