MySQL学习之流程控制

前言、流程控制结构

顺序结构:程序从上往下顺序执行
分支结构:程序从两条或者多条路径中选择一条执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

一、分支结构

1-1、if函数
语法:
    if(条件,值1,值2)

特点:
    可以用在任何位置
1-2、case结构
语法:
    情况一:类似于switch
    case 表达式
    when 值1 then 结果1或语句1(如果是语句,需要加分号) 
    when 值2 then 结果2或语句2(如果是语句,需要加分号)
    ...
    else 结果n或语句n(如果是语句,需要加分号)
    end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

    情况二:类似于多重if
    case 
    when 条件1 then 结果1或语句1(如果是语句,需要加分号) 
    when 条件2 then 结果2或语句2(如果是语句,需要加分号)
    ...
    else 结果n或语句n(如果是语句,需要加分号)
    end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

特点:
    可以用在任何位置
1-3、if elseif结构
语法:
    if 情况1 then 语句1;
    elseif 情况2 then 语句2;
    ...
    else 语句n;
    end if;

特点:
    只能用在begin end中!!!!!!!!!!!!!!!
1-4、三者的比较
三者比较:
                  应用场合
    if函数          简单双分支
    case结构        等值判断 的多分支
    if结构          区间判断 的多分支

二、分支结构案例

#案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER $
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
DELIMITER $
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)

#案例3:创建函数,实现传入成绩,如果成绩>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)

三、循环结构

分类:
while、loop、repeat

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

3-1、while循环
语法:

【标签:】while 循环条件 do
    循环体;
end while【 标签】;

联想:

while(循环条件){
    循环体;
}
3-2、loop循环
语法:

【标签:】loop
    循环体;
end loop 【标签】;

可以用来模拟简单的死循环
3-3、repeat循环
语法:

【标签:】repeat
    循环体;
until 结束循环的条件
end repeat 【标签】;

四、循环结构案例

#1.没有添加循环控制语句
#案例:批量插入,根据次数插入到admin表中多条记录
DELIMITER $
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)


#2.添加leave语句
#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
DELIMITER $
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表中多条记录,只插入偶数次
DELIMITER $
CREATE PROCEDURE test_while2(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_while2(100)

经典练习题

/*一、已知表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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容