美文网首页
mysql 流程控制语句

mysql 流程控制语句

作者: 暴躁程序员 | 来源:发表于2023-03-14 09:08 被阅读0次

    一、mysql 条件语句

    1. if() 函数

    1. 语法
    IF(expr1,expr2,expr3) -- 如果expr1成立,那么执行expr2,否则执行expr3,类似三元运算
    
    1. 示例:
    SELECT IF(1=1,2,3) -- 结果:2
    

    2. if else 语句

    注意事项:IF 结构作为独立的语句使用必须放在 begin end 中,结束语句用 END IF;
    
    1. 语法
    IF 表达式语句1 THEN 执行体1;
    ELSEIF 表达式语句2 THEN 执行体2;
    ELSEIF 表达式语句3 THEN 执行体3;
    ...
    ELSE 执行体;
    END IF;
    
    1. 示例:格式化年龄段
    CREATE FUNCTION formate_age(age INT) RETURNS VARCHAR(22)
    BEGIN
    IF age <= 6 THEN RETURN '婴幼儿';
    ELSEIF age <= 12 THEN RETURN '少儿';
    ELSEIF age <= 17 THEN RETURN '青少年';
    ELSEIF age <= 45 THEN RETURN '青年';
    ELSEIF age <= 69 THEN RETURN '中年';
    ELSE RETURN '老年';
    END IF;
    END;
    
    SELECT formate_age(10); -- 少儿
    

    3. case when 语句

    注意事项:
    1. case 可以作为表达式嵌套在 select 语句中,结束语句必须用 end 
    2. case 可以作为独立的语句放在 begin end 中使用,结束语句必须用 end case
    3. 在 then 后面,如果是返回值则不加分号,如果是表达式语句则加分号;
    
    1. 等值判断语法
    CASE 表达式或者字段
    WHEN 比较的值1 THEN 返回值1或语句
    WHEN 比较的值2 THEN 返回值2或语句
    ...
    ELSE 返回值或语句
    END CASE; -- 如果 case 作为表达式嵌套在 select 语句中结束语句用 end 
    
    1. 等值判断示例:格式化性别
    -- 1. case 作为表达式嵌套在 select 语句中,且结束语句用 end 
    SELECT id, realname,(
        CASE gender
        WHEN 1 THEN '男'
        WHEN 0 THEN '女'
        ELSE '其他'
        END
    ) gender FROM user_info;
    
    -- 2. case 作为独立的语句使用必须放在 begin end 中,且结束语句用 end case
    CREATE PROCEDURE formate_gender(IN gender INT) 
    BEGIN
    CASE gender
    WHEN 1 THEN SELECT '男';
    WHEN 0 THEN SELECT '女';
    ELSE SELECT '其他';
    END CASE;
    END;
    CALL formate_gender(1);
    
    1. 区间判断语法
    CASE 
    WHEN 条件表达式1 THEN 返回值或语句
    WHEN 条件表达式2 THEN 返回值或语句
    ...
    ELSE 返回值或语句
    END CASE; -- 如果 case 作为表达式嵌套在 select 语句中结束语句用 end 
    
    1. 区间判断示例:格式化年龄段
    -- 1. case 作为表达式嵌套在 select 语句中,且结束语句用 end 
    SELECT id, realname,(
        CASE 
        WHEN age <= 6 THEN '婴幼儿'
        WHEN age <= 12 THEN '少儿'
        WHEN age <= 17 THEN '青少年'
        WHEN age <= 45 THEN '青年'
        WHEN age <= 69 THEN '中年'
        ELSE '老年'
        END
    ) age FROM user_info;
    
    -- 2. case 作为独立的语句使用必须放在 begin end 中,且结束语句用 end case
    CREATE PROCEDURE formate_age(IN age VARCHAR(22)) 
    BEGIN
    CASE 
    WHEN age <= 6 THEN SELECT '婴幼儿';
    WHEN age <= 12 THEN SELECT '少儿';
    WHEN age <= 17 THEN SELECT '青少年';
    WHEN age <= 45 THEN SELECT '青年';
    WHEN age <= 69 THEN SELECT '中年';
    ELSE SELECT '老年';
    END CASE;
    END;
    
    CALL formate_age(10); -- 少儿
    

    二、mysql 循环语句

    -- 创建测试表
    CREATE TABLE IF NOT EXISTS user_info(
        id INT PRIMARY key auto_increment,
        uid INT NOT NULL,
        realname VARCHAR(22) NOT NULL,
        gender INT NOT NULL,
        height SMALLINT NOT NULL,
        age SMALLINT NOT NULL
    );
    

    1. while 循环(先判断后循环)

    1. 语法
    标签: while 循环条件 do 循环体 end while 标签;
    
    1. 示例:向用户表中批量插入 n 条数据
    CREATE PROCEDURE insert_user(IN num INT) 
    BEGIN
        DECLARE i INT DEFAULT 0;
        mywhile: while i < num 
        do 
        INSERT INTO user_info(uid,realname,gender,height,age) VALUES (i+1,CONCAT('张三',i),1,155 + i,22+i);
        SET i := i + 1;
        end while mywhile;
    END;
    
    CALL insert_user(20); 
    

    2. repeat 循环(先循环后判断)

    1. 语法
    标签:repeat 循环体 until 结束循环的条件 end repeat 标签; 
    
    1. 示例:向用户表中批量插入 n 条数据
    CREATE PROCEDURE insert_user(IN num INT) 
    BEGIN
        DECLARE i INT DEFAULT 0;
        myrepeat: repeat 
        INSERT INTO user_info(uid,realname,gender,height,age) VALUES (i+1,CONCAT('张三',i),1,155 + i,22+i);
        SET i := i + 1;
        UNTIL i > num
        end repeat myrepeat;
    END;
    
    CALL insert_user(20); 
    

    3. loop 循环(死循环,一般搭配leave使用)

    1. 语法
    标签: loop 循环体 end loop 标签; 
    
    1. 示例:向用户表中批量插入 n 条数据
    CREATE PROCEDURE insert_user(IN num INT) 
    BEGIN
        DECLARE i INT DEFAULT 1;
        myloop: loop 
        INSERT INTO user_info(uid,realname,gender,height,age) VALUES (i+1,CONCAT('张三',i),1,155 + i,22+i);
        IF i > num THEN LEAVE myloop;
        SET i := i + 1;
        END IF;
        end loop myloop;
    END;
    
    CALL insert_user(20); 
    

    三、mysql 跳过和终止循环语句

    1. iterate 跳过
      结束本次循环,继续下次循环,相当于JavaScript中的 continue,可搭配标签使用
    2. leave 终止
      结束当前循环,相当于JavaScript中的 break,可搭配标签使用

    相关文章

      网友评论

          本文标题:mysql 流程控制语句

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