MySQL流程控制語句詳解
在儲存過程和自定義函式中可以使用流程控制語句來控制程式的流程。MySQL 中流程控制語句有:IF 語句、CASE 語句、LOOP 語句、LEAVE 語句、ITERATE 語句、REPEAT 語句和 WHILE 語句等。
下面將詳細講解這些流程控制語句。
1. IF語句
IF 語句用來進行條件判斷,根據是否滿足條件(可包含多個條件),來執行不同的語句,是流程控制中最常用的判斷語句。其語法的基本形式如下:
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list]... [ELSE statement_list] END IF
其中,search_condition 引數表示條件判斷語句,如果返回值為 TRUE ,相應的 SQL 語句列表(statement_list)被執行;如果返回值為 FALSE,則 ELSE 子句的語句列表被執行。statement_list 可以包括一個或多個語句。
注意:MySQL 中的 IF( ) 函式不同於這裡的 IF 語句。
例 1
下面是一個使用 IF 語句的示例。程式碼如下:
IF age>20 THEN SET @count1=@count1+1; ELSEIF age=20 THEN @count2=@count2+1; ELSE @count3=@count3+1; END lF;
該示例根據 age 與 20 的大小關係來執行不同的 SET 語句。如果 age 值大於20,那麼將 count1 的值加 1;如果 age 值等於 20,那麼將 count2 的值加 1;其他情況將 count3 的值加 1。IF 語句都需要使用 END IF 來結束。
2. CASE語句
CASE 語句也是用來進行條件判斷的,它提供了多個條件進行選擇,可以實現比 IF 語句更復雜的條件判斷。CASE 語句的基本形式如下:
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list]... [ELSE statement_list] END CASE
其中:
- case_value 引數表示條件判斷的變數,決定了哪一個 WHEN子句會被執行;
- when_value 引數表示變數的取值,如果某個 when_value 表示式與 case_value 變數的值相同,則執行對應的 THEN 關鍵字後的 statement_list 中的語句;
- statement_list 引數表示 when_value 值沒有與 case_value 相同值時的執行語句。
- CASE 語句都要使用 END CASE 結束。
CASE 語句還有另一種形式。該形式的語法如下:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
其中,search_condition 引數表示條件判斷語句;statement_list 引數表示不同條件的執行語句。
與上述語句不同的是,該語句中的 WHEN 語句將被逐個執行,直到某個 search_condition 表示式為真,則執行對應 THEN 關鍵字後面的 statement_list 語句。如果沒有條件匹配,ELSE 子句裡的語句被執行。
這裡介紹的 CASE 語句與“控制流程函式”裡描述的 SQL CASE 表示式的 CASE 語句有輕微的不同。
這裡的 CASE 語句不能有 ELSE NULL 語句,並且用 END CASE 替代 END 來終止。
例 2
下面是一個使用 CASE 語句的示例。程式碼如下:
CASE age WHEN 20 THEN SET @count1=@count1+1; ELSE SET @count2=@count2+1; END CASE;
程式碼也可以是下面的形式:
CASE WHEN age=20 THEN SET @count1=@count1+1; ELSE SET @count2=@count2+1; END CASE;
本示例中,如果 age 值為 20,count1 的值加 1,否則 count2 的值加 1。
3. LOOP 語句
LOOP 語句可以使某些特定的語句重複執行。與 IF 和 CASE 語句相比,LOOP 只實現了一個簡單的迴圈,並不進行條件判斷。
LOOP 語句本身沒有停止迴圈的語句,必須使用 LEAVE 語句等才能停止迴圈,跳出迴圈過程。LOOP 語句的基本形式如下:
[begin_label:]LOOP
statement_list
END LOOP [end_label]
其中,begin_label 引數和 end_label 引數分別表示迴圈開始和結束的標誌,這兩個標誌必須相同,而且都可以省略;statement_list 引數表示需要迴圈執行的語句。
例 3
使用 LOOP 語句進行迴圈操作。程式碼如下:
add_num:LOOP SET @count=@count+1; END LOOP add_num;
該示例迴圈執行 count 加 1 的操作。因為沒有跳出迴圈的語句,這個迴圈成了一個死迴圈。LOOP 迴圈都以 END LOOP 結束。
4. LEAVE 語句
LEAVE 語句主要用於跳出迴圈控制。其語法形式如下:
LEAVE label
其中,label 引數表示迴圈的標誌,LEAVE 語句必須跟在迴圈標誌前面。
例 4
下面是一個 LEAVE 語句的示例。程式碼如下:
add_num:LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num; END LOOP add_num;
該示例迴圈執行 count 加 1 的操作。當 count 的值等於 100 時,跳出迴圈。
5. ITERATE 語句
ITERATE是“再次迴圈”的意思,用來跳出本次迴圈,直接進入下一次迴圈。ITERATE 語句的基本語法形式如下:
ITERATE label
其中,label 引數表示迴圈的標誌,ITERATE 語句必須跟在迴圈標誌前面。
例 5
下面是一個 ITERATE 語句的示例。程式碼如下:
add_num:LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num; ELSE IF MOD(@count,3)=0 THEN ITERATE add_num; SELECT * FROM employee; END LOOP add_num;
該示例迴圈執行 count 加 1 的操作,count 值為 100 時結束迴圈。如果 count 的值能夠整除 3,則跳出本次迴圈,不再執行下面的 SELECT 語句。
說明:LEAVE 語句和 ITERATE 語句都用來跳出迴圈語句,但兩者的功能是不一樣的。
LEAVE 語句是跳出整個迴圈,然後執行迴圈後面的程式。而 ITERATE 語句是跳出本次迴圈,然後進入下一次迴圈。使用這兩個語句時一定要區分清楚。
6. REPEAT 語句
REPEAT 語句是有條件控制的迴圈語句,每次語句執行完畢後,會對條件表示式進行判斷,如果表示式返回值為 TRUE,則迴圈結束,否則重複執行迴圈中的語句。
REPEAT 語句的基本語法形式如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
其中:
- begin_label 為 REPEAT 語句的標註名稱,該引數可以省略;
- REPEAT 語句內的語句被重複,直至 search_condition 返回值為 TRUE。
- statement_list 引數表示迴圈的執行語句;
- search_condition 引數表示結束迴圈的條件,滿足該條件時迴圈結束。
- REPEAT 迴圈都用 END REPEAT 結束。
例 6
下面是一個使用 REPEAT 語句的示例。程式碼如下:
REPEAT SET @count=@count+1; UNTIL @count=100 END REPEAT;
該示例迴圈執行 count 加 1 的操作,count 值為 100 時結束迴圈。
7. WHILE 語句
WHILE 語句也是有條件控制的迴圈語句。WHILE 語句和 REPEAT 語句不同的是,WHILE 語句是當滿足條件時,執行迴圈內的語句,否則退出迴圈。WHILE 語句的基本語法形式如下:
[begin_label:] WHILE search_condition DO
statement list
END WHILE [end label]
其中,search_condition 引數表示迴圈執行的條件,滿足該條件時迴圈執行;statement_list 引數表示迴圈的執行語句。WHILE 迴圈需要使用 END WHILE 來結束。
例 7
下面是一個使用 WHILE 語句的示例。程式碼如下:
WHILE @count<100 DO SET @count=@count+1; END WHILE;
該示例迴圈執行 count 加 1 的操作,count 值小於 100 時執行迴圈。如果 count 值等於 100 了,則跳出迴圈。