mysql分流程审批如何规划表 mysql流程控制_循环结构

 

#流程控制结构
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定的条件基础上重复执行一段代码

#分支结构
1.if函数
功能:实现简单的双分支
SELECT IF(表达式1,表达式2,表达式3)
执行顺序:如果表达式1成立,返回表达式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省略并且所有的WHEN条件都不满足,则返回NULL

#案例:
#创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩在90-100A,80-90B,60-80C,否则D
CREATE PROCEDURE test_case(IN score INT)
BEGIN
    CASE
    WHEN score<=100 AND score >=90 THEN SELECT 'A';
    WHEN score <90 AND score >=80 THEN SELECT 'B';
    WHEN score >=60 THEN SELECT 'C';
    ELSE SELECT 'D';
    END CASE;
END $

CALL test_case(94) $

3.if结构
功能:实现多重分支,完全跟Java一样
语法:
    IF 条件1 THEN 语句1;
    ELSEIF 条件2 THEN 语句2;
    ...
    【ELSE 语句n;】
应用:只能应用在BEGIN END中
#案例:根据传入的成绩,来返回等级,比如传入的成绩在90-100A,80-90B,60-80C,否则D
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
    IF score >= 90 AND score <= 100 THEN RETURN 'A';
    ELSEIF score <90 AND score >=80 THEN RETURN 'B';
    ELSEIF score >=60 THEN RETURN 'C';
    ELSE RETURN 'D';
    END IF;
END $

#循环结构
分类:
#while/loop/repeat
循环控制:
ITERATE类似于CONTINUE继续,结束本次循环,继续下一次
LEAVE类似于break,跳出,结束当前所在的循环

1.while
语法:
    标签:WHILE 循环条件 DO
        循环体;
    END WHILE 标签;
写上标签可以搭配循环控制使用,也可以不加。
2.loop
语法:
    标签:LOOP
        循环体;
    END LOOP 便签;
可以用来模拟简单的死循环
3.repeat
语法:
    标签:REPEAT
        循环体;
    UNTIL 结束循环的条件
    END REPEAT 标签;
#类似于do while,肯定能执行一次。

#while演示:
批量插入,根据设置次数插入到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)$

添加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)$;

添加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 IF;
        
    END WHILE a;
END $
CALL test_while1(100)$;

经典案例:

/*
一、已知表stringconteng
其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
*/

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 DEFAULT 1;
    DECLARE len INT DEFAULT 1;#截取字符长度
    WHILE i<=insertCount DO
        
        SET len = FLOOR(RAND()*(20-startIndex+1)+1);#1~(20-startIndex+1)
        SET startIndex = FLOOR(RAND()*26+1);
        INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
        SET i=i+1;
END $
CALL test_randstr_insert(10)$