• [终章]进阶20-流程控制结构--if/case/while结构


    1. mysql 存储过程中尽量使用 @变量 而不用局部变量, @变量不容易报错!权限小,更改一下就报错!
    2. sql中判断相等'=' ,用'=' 不用'=='.
    3.
    #流程控制结构
    /*
    顺序结构: 程序从上往下依次执行;
    分支结构: 程序从多条路径中选择一条往下执行
    循环结构: 程序在满足一定条件的基础上,重复执行一段代码
    
    */
    
    #一: 分支结构
    
    #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');
  • 相关阅读:
    OpenStack--Havana
    腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
    Java 脚本化编程指南
    hive的表的基本操作
    如何搭建易企秀H5平台?
    HDU 4727-The Number Off of FFF
    审计厅审计云发展意见
    CNPM 遇到use strict的问题
    QA技术概览
    终端的CTRL+S 解说
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9901015.html
Copyright © 2020-2023  润新知