美文网首页
流程控制结构

流程控制结构

作者: Lijy_李俊阳 | 来源:发表于2019-05-31 23:26 被阅读0次

    说明:
    顺序结构:程序从上往下依次执行
    分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行
    循环结构:程序满足一定条件下,重复执行一组语句

    1、分支结构

    特点:

    1、if函数

    功能:实现简单双分支
    语法:
    if(条件,值1,值2)
    位置:
    应用在begin end中或外面,可以作为表达式放在任何位置

    2、case结构

    功能:实现多分支
    语法1:
    case 表达式或字段
    when 值1 then 语句1;
    when 值2 then 语句2;
    ..
    else 语句n;
    end [case];

    语法2:
    case
    when 条件1 then 语句1;
    when 条件2 then 语句2;
    ..
    else 语句n;
    end [case];

    位置:
    可以放在任何位置,
    如果放在begin end 外面,作为表达式结合着其他语句使用
    如果放在begin end 里面,一般作为独立的语句使用

    3、if结构

    功能:实现多分支
    语法:
    if 条件1 then 语句1;
    elseif 条件2 then 语句2;
    ...
    else 语句n;
    end if;
    位置:
    只能放在begin end中

    案例
    #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
    
    CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
    BEGIN
        DECLARE ch CHAR DEFAULT 'A';
        IF score>90 THEN SET ch='A';
        ELSEIF score>80 THEN SET ch='B';
        ELSEIF score>60 THEN SET ch='C';
        ELSE SET ch='D';
        END IF;
        RETURN ch;
        
        
    END $
    
    SELECT test_if(87)$
    
    #案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
    
    
    CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
    BEGIN
        IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
        ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
        ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
        END IF;
        
    END $
    
    CALL test_if_pro(2100)$
    
    #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
    
    CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
    BEGIN 
        DECLARE ch CHAR DEFAULT 'A';
        
        CASE 
        WHEN score>90 THEN SET ch='A';
        WHEN score>80 THEN SET ch='B';
        WHEN score>60 THEN SET ch='C';
        ELSE SET ch='D';
        END CASE;
        
        RETURN ch;
    END $
    
    SELECT test_case(56)$
    

    2、循环结构

    分类:

    while、loop、repeat

    对比:

    ①这三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或iterate)则必须添加名称
    ②loop 一般用于实现简单的死循环
    while 先判断后执行
    repeat 先执行后判断,无条件至少执行一次

    1、while

    语法:
    【名称:】while 循环条件 do
    循环体
    end while 【名称】;

    2、loop

    语法:
    【名称:】loop
    循环体
    end loop 【名称】;

    3、repeat

    语法:
    【名称:】repeat
    循环体
    until 结束条件
    end repeat 【名称】;

    二、循环控制语句

    leave:类似于break,用于跳出所在的循环
    iterate:类似于continue,用于结束本次循环,继续下一次

    #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)$
    #插入了100条
    
    /*
    
    int i=1;
    while(i<=insertcount){
    
        //插入
        
        i++;
    
    }
    
    */
    
    
    #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)$
    
    /*
    
    int i=0;
    while(i<=insertCount){
        i++;
        if(i%2==0){
            continue;
        }
        插入
        
    }
    
    */
    

    经典实例

    /*一、已知表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+1)
            INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
            SET i=i+1;
        END WHILE;
    
    END $
    
    CALL test_randstr_insert(10)$
    

    相关文章

      网友评论

          本文标题:流程控制结构

          本文链接:https://www.haomeiwen.com/subject/rwvntctx.html