1. 程式人生 > 實用技巧 >MySQL--流程控制結構

MySQL--流程控制結構

一、分支結構

  #1.if 函式

    語法:if(條件 , 值1,值2)
    功能:實現雙分支
    應用在begin end中或外面      #2.case 結構

    語法:
    情況1:類似於switch
      case 變數或表示式
      when 值1 then 語句1;
      when 值2 then 語句2;
        ...
      else 語句n;
      end          情況2:
      case
      when 條件1 then 語句1;
      when 條件2 then 語句2;
        ...
      else 語句n;
      end       應用在begin end 中或外面   #3.if 結構     語法:
      if 條件 1 then 語句1;
      else if 條件2 then 語句2;
        ....
      else 語句n;
      end if;
    功能:類似於多重if     只能應用在begin end 中 #案例1:建立函式,實現傳入成績,如果成績>90,返回A,如果成績>80,返回B,如果成績>60,返回C,否則返回D
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A'; IF score>90 THEN SET ch='A'; ELSEIF score>80 THEN SET ch='B'; ELSEIF score>60 THEN SET ch='C'; ELSE SET ch='D'; END IF; RETURN ch; END $ SELECT test_if(87)$

#案例2:建立儲存過程,如果工資<2000,則刪除,如果5000>工資>2000,則漲工資1000,否則漲工資500
CREATE PROCEDURE test_if_pro(IN sal DOUBLE
) BEGIN IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal; ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal; ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal; END IF; END $ CALL test_if_pro(2100)$

#改進--案例1:建立函式,實現傳入成績,如果成績>90,返回A,如果成績>80,返回B,如果成績>60,返回C,否則返回D
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN 
 DECLARE ch CHAR DEFAULT 'A';
 
 CASE   #------case塊
 WHEN score>90 THEN SET ch='A';
 WHEN score>80 THEN SET ch='B';
 WHEN score>60 THEN SET ch='C';
 ELSE SET ch='D';
 END CASE;
 
 RETURN ch;
END $
SELECT test_case(56)$

二、迴圈結構

  分類:
    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 【標籤】; #1.沒有新增迴圈控制語句
#案例:批量插入,根據次數插入到admin表中多條記錄
DROP PROCEDURE pro_while1$
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)$

/* java 對應

int i=1;
while(i<=insertcount){ //插入

i++; } */
#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)$

#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)$

/*

int i=0;
while(i<=insertCount){
i++;
if(i%2==0){
continue;
}
插入

} */