[终章]进阶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');
原文地址:https://www.cnblogs.com/zhazhaacmer/p/9901015.html