(十三)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 $