Mysql_流程控制结构

#流程控制结构

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

    分支结构:程序两条或多条路径选择一条去执行

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

 

#一、分支结构

    #1.if函数

        功能:实现简单的双分支

        语法:

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

          执行顺序:

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

          应用:任何地方

 

    #2.case结构

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

        语法:

            CASE 变量|表达式|字段

            WHEN 要判断的值 THEN 返回的值1或语句1;

            WHEN 要判断的值 THEN 返回的值2或语句1;

            ... ...

            ELSE 要返回的值n或语句n;

            END CASE;

    

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

        语法:

            CASE

            WHEN 要判断的条件1 THEN 返回的值1或语句1;

            WHEN 要判断的条件2 THEN 返回的值2或语句1;

            ... ...

            ELSE 要返回的值n或语句n;

            END CASE;

    特点:

        一:可以作为表达式,嵌套在其它语句中使用,可以放在任何地方,begin end中 或begin end外边

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

        二:如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case

                如果都不满足,则执行else中的语句或值

        三:else可以省略,如果else省略了,并且所有when条件都不满足,则返回null

 

    #案例、创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩:100-90显示A,90-80显示B,80-60显示C,否则,显示D

        DELIMITER $

        CREATE PROCEDURE level_score(IN score INT)

        BEGIN

            CASE

            WHEN score<100 AND score>90 THEN SELECT 'A';

            WHEN score>80 THEN SELECT 'B';

            WHEN score>60 THEN SELECT 'C';

            ELSE SELECT 'D';

            END CASE;

        END $

        CALL level_score(96)$

        

 

    #3.if结构

        功能:实现多重分支

        语法:

            if 条件1 then 语句1;

            elseif 条件2 then 语句2;

            ... ...

            else 语句n;

            end if;

        应用场合:只能应用在begin end中

 

    #案例1.根据传入的成绩,来显示等级,比如传入的成绩:100-90返回A,90-80返回B,80-60返回C,否则,返回D

        CREATE FUNCTION func_level(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 func_level(63)$

        

 

 

#二、循环结构

        

        while、loop、repeat

            循环控制:

            iterate类似于 countinu,继续,结束本次循环,继续下一次

            leave 类似于 break,跳出,结束当前所在的循环

 

        #1.while

            语法:

            【标签:】while 循环条件 do

                    循环体;

                end while 【标签】;

 

             联想java中

             while(循环条件){

                 循环体;

             }

 

        #2.loop

            语法:

            【标签:】loop

                    循环体;

                end loop 【标签】;

            可以用来模拟简单的死循环

 

        #3.repeat  类似与java中的do...while

            语法:

            【标签:】repeat

                    循环体;

                until 结束循环的条件

                end repeat 【标签】;

 

    #1.没有添加循环控制语句

        #案例:批量插入,根据次数插入到admin表中多条记录

            DROP PROCEDURE pro_while1;

            DELIMITER $

            CREATE PROCEDURE pro_while1(IN insertCount INT)

            BEGIN

                DECLARE i INT DEFAULT 1;#定义局部变量 做循环条件

                WHILE i<insertCount DO  

                    INSERT INTO admin(username,`password`) VALUE(CONCAT('Rose',i),'7777');

                    SET i=i+1;  #i自增长

                END WHILE;

            END $

 

            CALL pro_while1(50)$

         

        查看调用的结果

        

 

    #2.添加leave语句

        #案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止

            TRUNCATE TABLE admin$ #清空admin的数据

            CREATE PROCEDURE leave_while(IN insertCount INT)

            BEGIN

                DECLARE i INT DEFAULT 1;

                a:WHILE i<=insertCount DO

                    INSERT INTO admin(username,`password`) VALUE(CONCAT('小花',i),'0000');

                    IF i>=20 THEN LEAVE a;  #当a大于20时 结束标签a 跳出循环

                    END IF;

                    SET i=i+1;

                END WHILE a;

            END $

            CALL leave_while(50)$

          

        当a大于20时停止本次循环

          

 

    #3.添加iterate语句

        #案例:批量插入,根据次数插入到admin表中多条记录,插入偶数次

            CREATE PROCEDURE iterate_pro(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`) VALUE(CONCAT('li俊杰',i),'5555');

                END WHILE a;

            END $

 

            CALL iterate_pro(100)$

        

        

 

#流程控制经典案例

 

        一、已知表stringcontent

            其中字段:

            id 自增长

            content varchar(20)

            向该表插入指定个数的,插入指定个数 随机的字符串

#创建stringcontent表

        DROP TABLE IF EXISTS stringcontent;

        CREATE TABLE stringcontent(

            id INT PRIMARY KEY AUTO_INCREMENT,

            content VARCHAR(20)

        );

#rand()函数生成0到0.9999无限接近于1的数

#创建test_rand_str存储过程

        CREATE PROCEDURE test_rand_str(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 startIndex=FLOOR(RAND()*26+1);#产生一个随机的整数,代表起始索引1到26

                SET len=FLOOR(RAND()*(26-startIndex+1));#产生一个随机的整数,代表 截取长度1到26-startIndex+1

                INSERT INTO stringcontent(content) VALUE(SUBSTR(str,startIndex,len));

                SET i=i+1;#循环迭代条件

            END WHILE;

        END $

        

#调用存储过程

        CALL test_rand_str(10)$

        SELECT *FROM stringcontent$

        

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值