MySQL --- 24♪ [终章] 进阶20 流程控制结构--if/case/while结构 - 三个while的存储过程案例(批量生成表单数据) - 随机长度的随机字符串的存储过程案例

#流程控制结构

/*

顺序结构: 程序从上往下依次执行;

分支结构: 程序从多条路径中选择一条往下执行

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

 

*/

 

#一: 分支结构

 

#if 函数 : 实现简单的双分支

/*语法: 实现简单的双分支

    if(表达式1,表达式2,表达式3)

    执行顺序:

    如果表达式1成立, 则if函数返回表达式2的值, 否则返回表达式3的值

*/

 

#2.case 结构

/*

情况1: 类似于java中的switch 语句,一般用于实现等值判断;

 

语法: case 变量/表达式/字段

    when 要判断的值1 then 返回的值1

    when 要判断的值2 then 返回的值2

    when 要判断的值3 then 返回的值3

    ....

    else 要返回的值n

    end

 

情况2: 类似于java中的多重IF 语句,一般用于实现区间的判断

 

语法:

    case

    when 要判断的条件1 then 返回的值1或者语句1;

    when 要判断的条件2 then 返回的值2或者语句2;

    ...

    else 要返回的值n或语句n;     #可以省略else

    end case;

 

特点:

    1)可以作为表达式,嵌套在其他语句中使用,可以放在任何地方, begin end 中,或 begin end 的外面

    2)可以作为独立的语句去使用,只能放在begin end中

    3)如果when中的某一项值满足条件或者条件成立,则执行对应的then后面的语句,并且结束case

      如果都不满足,则执行else 语句

    4)else可以省略,

*/

 

#案例:

 

#创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩: 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) $  #A

CALL test_case(55) $  #D

 

#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;

DELIMITER $

CREATE FUNCTION test_if(score INT) RETURNS NVARCHAR(10)

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(66) $   #C

 

#二: 循环结构

/*

分类: while/loop/repeat

 

循环控制:

    结束本次循环进行下一次:  iterate 类似于continue

    结束当前所在的循环结构 :     leave  类似于break

    IF 条件 THEN LEAVE 标签名;

    END IF;

*/

 

#1.while   ****重点

/*语法:

    [标签(名字):]while 循环条件 do

        循环体;

    end while[标签名];

*/

 

#2.loop

/*

语法:

[标签:]loop

    循环体;

end loop[标签];

  #需要搭配leave跳出死循环!

#常用来表示模拟单纯的死循环

*/

 

#3.repeat

/*

语法:

[标签名:]repeat

    循环体;

util 结束循环的条件;

end repeat [标签];

*/

 

#案例1(简单while循环): 批量插入,根据次数插入到admin 表中的多条记录

DELIMITER $

CREATE PROCEDURE 批量插入1(IN insertCount INT)

BEGIN

    DECLARE i INT DEFAULT 1;

    wa: WHILE i<=insertCount DO

        INSERT INTO admin(username,`password`) VALUES('Rose'+i,'660');

        SET i=i+1;

    END WHILE wa;

    

END $

 

CALL 批量插入1(100) $

 

#案例2(LEAVE(break循环的)+while循环): 批量插入,根据次数插入到admin 表中的多条记录,; 如果次数大于20,则停止插入数据

TRUNCATE TABLE admin;

DELIMITER $

CREATE PROCEDURE 批量插入2(IN insertCount INT)

BEGIN

    DECLARE i INT DEFAULT 1;

    wa: WHILE i<=insertCount DO

        INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456');

        IF i>=20 THEN LEAVE wa;

        END IF;

        SET i=i+1;

    END WHILE wa;

    

END $

 

CALL 批量插入2(100) $

 

#案例3(iterate(continue)+while循环): 批量插入,根据次数插入到admin 表中的多条记录; 仅仅偶数学号插入.

TRUNCATE TABLE  admin;

 

DELIMITER $

CREATE PROCEDURE 批量插入5(IN insertCount INT)

BEGIN

    DECLARE i INT DEFAULT 0;

    wa: WHILE i<=insertCount DO

        SET i=i+1;        

        IF i%2=1 THEN ITERATE wa;

        END IF;

        INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456');

    END WHILE wa;

    

END $

 

CALL 批量插入5(60) $

 

###############################################

/*案例一:已知表StringContent ,向该表插入指定的个数的随机长度的随机字符串[1,20]

        ****随机模式-先随机长度,然后再从字母表中取出一个字符加进已有的字符串

其中字段:

id 自增长, content varchar(20)

*/

 

CREATE TABLE StringContent(

    id INT PRIMARY KEY AUTO_INCREMENT ,

    content VARCHAR(20)

);

 

DELIMITER $

CREATE PROCEDURE test_randstr_insert4(IN nums INT)

BEGIN

    #select concat('共插入',nums,'条数据');

    SET @i = 0;

    SET @table_str ='abcdefghijklmnopqrstuvwxyz';

    

    a:WHILE @i<nums DO

        SET @i=@i+1;

        SET @s2str = '';

        SET @len = CEILING(RAND()*15);  #代表字符长度 ,共需要循环随机产生len次数据

        SET @j = 0;

        b:WHILE @j<@len+1 DO

            SET @j=@j+1;

            SET @s2str = CONCAT(@s2str ,SUBSTR(@table_str,CEILING(RAND()*26),1) );

        END WHILE b;

        INSERT INTO `stringcontent`(id,content) VALUES(@i,@s2str);

    END WHILE a;

END $

 

CALL test_randstr_insert4(FLOOR(RAND()*100)+1) $

 

 

SELECT RAND();  #0.41551091188146816

SELECT FLOOR(RAND()*100);   #FLOOR 函数返回小于或等于所给数字表达式的最大整数, 获取[0,99]之间的数值

SELECT CEILING(RAND() * 100); #CEILING 函数返回大于或等于所给数字表达式的最小整数, 获取[1,100]之间的数值

SELECT ROUND(RAND() *100);   #四舍五入 ,获取[0,100]之间的数值, 可以出现: 0和100

 

 

SELECT ('a'+'b');

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值