1. 程式人生 > >(十三)MySQL基礎——流程控制結構

(十三)MySQL基礎——流程控制結構

三種流程控制結構:

①順序結構:程式從上往下依次執行

②分支結構:程式從兩條或多條路徑中選擇一條去執行

③迴圈結構:程式在滿足一定條件的基礎上,重複執行一段程式碼

一、分支結構

(1)if函式

功能:能夠實現簡單的雙分支

語法:SELECT   IF (表示式1,表示式2,表示式3)

執行順序:如果表示式1成立,則IF函式返回表示式2的值,否則返回表示式3的值(類似於三目運算子的執行順序)

應用場景:任何地方

(2)case結構

情況1 :類似於java中的switch語句,一般用於實現等值判斷

語法:

CASE 變數|表示式|欄位
WHEN 要判斷的值 THEN 返回的值1或語句1;
WHEN 要判斷的值 THEN 返回的值2或語句2;
...
ELSE 要返回的值n或語句n;
END  CASE;

情況2:類似於java中的多重if語句,一般用於實現區間判斷

語法:

CASE 
WHEN 要判斷的條件1 THEN 返回的值1
WHEN 要判斷的條件2 THEN 返回的值2
...
ELSE 要返回的值n
END

特點:

①可以作為表示式,巢狀在其他與句中使用,可以放在任何地方,GEGIN   END中或者BEGIN   END外面;

②也可以作為獨立的語句去使用,那麼就只能放在BEGIN   END中。;

③如果WHEN中的值滿足或條件成立,則執行對應的THEN後面的語句,並且結束CASE;如果都不滿足,則執行ELSE中的語句或值

④ELSE可以省略,如果ELSE省略了,並且所有WHEN條件都不滿足,則返回NULL;

-- 案例:建立儲存過程,根據傳入的成績來顯示等級,比如傳入的成績:90-100,顯示A;80-90,顯示B;60-80,顯示C;否則顯示D
DELIMITER $
CREATE PROCEDURE test_case(IN score INT)
BEGIN
    CASE
    WHEN score>=90 AND score<=100 THEN SELECT 'A';
    WHEN score>=80 THEN SELECT 'B';
    WHEN score>=60 THEN SELECT 'C';
    ELSE SELECT 'D';
    END CASE;
END $

-- 呼叫
CALL test_case(95)$

(3)if 結構

功能:實現多重分支

語法:

if 條件1 then 語句1;
else 條件2 then 語句2;
...
【else 語句n;】
end if;

應用場景:只能應用在BEGIN  END 中

案例:

-- 案例1:根據傳入的成績,來顯示等級,比如傳入的成績:90-100,返回A;80-90,返回B,60-80返回C,否則返回D
DELIMITER $
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
    IF score>=90 AND score<=100 THEN RETURN 'A';
    ELSEIF score>=80 THEN RETURN 'B';
    ELSEIF score>=60 THEN RETURN 'C';
    ELSE RETURN 'D';
    END IF;

END $

-- 呼叫
SELECT test_if(86)$

二、迴圈結構

分類:WHILE  、  LOOP  、 REPEAT

迴圈控制:

ITERATE  類似於  CONTINUE , 意思是繼續,結束本次迴圈,繼續下一次;

LEAVE  類似於  BREAK ,意思是跳出,結束當前所在的迴圈。

(1)WHILE

語法:

【標籤:】 WHILE 迴圈條件 DO 
    迴圈體;
END WHILE 【標籤】;

案例一:不新增迴圈控制語句的情況

-- 案例:批量插入,根據次數插入到admin表中多條記錄
DELIMITER $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=insertCount DO
        INSERT INTO admin(username,password) VALUES (CONCAT('Rose',i),'666');
        SET i = i+1;
    END WHILE;

END $

-- 呼叫
CALL pro_while1(100)$

案例二:新增LEAVE  循壞控制語句的情況

-- 案例:批量插入,根據次數插入到admin表中多條記錄,如果次數>20則停止
DELIMITER $
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<=insertCount DO
        INSERT INTO admin(username,password) VALUES (CONCAT('xiaohua',i),'0000');
        IF i >= 20 THEN LEAVE a;
        END IF;
        SET i = i+1;
    END WHILE a;

END $

-- 呼叫
CALL test_while1(100)$

案例三:新增ITERATE  迴圈控制語句的情況

-- 案例:批量插入,根據次數插入到admin表中多條記錄,只插入偶數次
DELIMITER $
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    a:WHILE i<=insertCount DO
        SET i = i+1;
        IF MOD(i,2)!=0 THEN ITERATE a;
        END IF;

        INSERT INTO admin(username,password) VALUES (CONCAT('xiaohua',i),'0000');
    END WHILE a;
END $

-- 呼叫
CALL test_while1(100)$

 

(2)LOOP

語法:

【標籤:】 LOOP 
    迴圈體;
END LOOP 【標籤】;

可以用來模擬簡單的死迴圈

(3)REPEAT

語法:

【標籤:】REPEAT 
    迴圈體;
UNTIL 結束迴圈的條件
END REPEAT  【標籤】;

三、經典案例:已知表stringcontent,其中欄位id自增長,content varchar(20),向該表插入指定個數的隨機字串

DROP TABLE IF EXISTS stringcontent;
CREATE TABLE stringcontent(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(20)
);

DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
-- 定義一個迴圈變數i,表示插入次數
    DECLARE i INT DEFAULT 1;
    DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
-- 代表起始索引
    DECLARE startIndex INT DEFAULT 1;
-- 代表擷取的字元的長度
    DECLARE len INT DEFAULT 1;
    WHILE i<=insertCount DO
--     產生一個隨機的整數,代表擷取長度,1-(26-startIndex+1)
        SET len=FLOOR(RAND()*(20-startIndex+1)+1);
--     產生一個隨機的整數,代表起始索引1-26
        SET startIndex=FLOOR(RAND()*26+1);
        INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
--     迴圈變數更新
        SET i=i+1; 
END WHILE;

END $