MySQL:流程控制结构

流程控制语句

顺序结构

  程序自上往下依次执行

分支结构

介绍

  程序从两条或多条路径中选择一条执行

if语句

/*
语法:
IF(表达式1,表达式2,表达式3)
执行顺序:
   如果表达式1成立,则返回表达式2的值,否则返回表达式3的值

应用:在任何地方 
*/

IF  THEN

/*
语法:
    IF         条件1 THEN 语句1;
    ELSEIF  条件2  THEN 语句2;
    ...
    ELSE 语句n;
    END IF;

应用在begin end中
*/

case

/*
情景1: 类似switch语句,实现等值判断
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回值1或语句1;
WHEN 要判断的值 THEN 返回值2或语句2;
...
ELSE 要返回的值n或语句n;
END CASE;

情景2: 类似多重if语句,实现区间判断
CASE
WHEN 要判断的条件1 THEN 返回值1或语句1;
WHEN 要判断的条件2 THEN 返回值2或语句2;
...
ELSE 要返回的值n或语句n;
END CASE;

特点:
   可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END里面或者外面;
   可以作为独立的语句去使用,只能放在BEGIN ENG中;
   如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并结束CASE;
   ELSE可以省略,如果else省略了,并且所有的WEHN条件都不满足,则返回NULL;
*/

循环结构

介绍

  程序在满足一定条件的基础上,重复执行一段代码

循环控制

  • iterate类似于continue,结束本次循环,继续下一次
  • leave 类似于break,结束当前所在的循环

while

/*
语法:
    【标签:】 while 循环条件 do
                  循环体;
                  end while [标签];
*/

loop

/*
语法:
    【标签:】 loop
                  循环体;
                  end loop[标签];
用来模拟死循环
*/

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

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

 案例

/*一、已知表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
    DECLARE i INT DEFAULT 1;
    DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
    DECLARE startIndex INT;#代表初始索引
    DECLARE len INT;#代表截取的字符长度
    WHILE i<=insertcount DO
        SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26
        SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-20-startIndex+1INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
        SET i=i+1;
    END WHILE;

END $

CALL test_randstr_insert(10)$

原文地址:https://www.cnblogs.com/gareth-yu/p/13964093.html