尚矽谷MySQL學習筆記(Day_6)-流程控制結構介紹

下雨不撐傘丶發表於2020-12-07

流程控制結構介紹

順序結構:程式從上往下依次執行
分支結構:程式可以從兩條或多條路徑中選擇一條去執行
迴圈結構:程式在滿足一定條件的基礎上,重複執行一段程式碼

一、分支結構

1.if 函式

功能:實現簡單的雙分支
語法: 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【或語句1;;】
      WHEN 要判斷的條件2 THEN 返回的值2【或語句2;;】
      …
      ELSE 要返回的值n【或語句n;】
      END 【CASE;】

特點:
      ①
            可以作為表示式,巢狀在其他語句中使用,可以放在任何地方,BEGIN END中或BEGIN END 的外面
            可以作為獨立的語句去使用,只能放在BEGIN END中
      ②
            如果WHEN中的值滿足或條件成立,則執行對應的THEN後面的語句,並且結束CASE
            如果都不滿足,則執行ELSE中的語句或值
      ③
            ELSE可以省略,如果ELSE省略了,並且所有WHEN條件都不滿足,則返回NULL

案例:建立儲存過程,根據傳入的成績,來顯示等級,比如傳入的成績:90~100,顯示A ,80~90,顯示B ,60~80, 顯示C,否則顯示D

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;
      elseif 條件2 then 語句2;
       …
      【else 語句n;】
       end if;

應用在begin end中

案例1:根據傳入的成績,來顯示等級,比如傳入的成績:90~100,返回A ,80~90返回B 60~80,返回C,否則返回D

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 【標籤;】

聯想: while (迴圈條件){ 迴圈體 }

2.loop

語法:
      【標籤:】loop
                   迴圈體 ;
      end loop 【標籤】;

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

3.repeat

語法:
      【標籤:】repeat
                  迴圈體;
       until 結束迴圈的條件
       end repeat【標籤】;

4.案例說明

1.沒有新增迴圈控制語句

案例:批量插入,根據次數插入到admin表中多條記錄
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) $
SELECT * FROM admin $

在這裡插入圖片描述

2.新增leave語句

案例:批量插入,根據次數插入到admin表中多條記錄,如果次數>20則停止
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) $
SELECT * FROM admin $

在這裡插入圖片描述

3.新增iterate語句

案例:批量插入,根據次數插入到admin表中多條記錄,只插入偶數次
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) $
SELECT * FROM admin $

在這裡插入圖片描述

三、總結

在這裡插入圖片描述

四、練習

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

CREATE TABLE stringcontent(
	id INT PRIMARY KEY AUTO_INCREMENT,
	content VARCHAR(20)
)$

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

在這裡插入圖片描述

相關文章