mysql 流程控制语句

2023-03-14  本文已影响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,可搭配标签使用
上一篇下一篇

猜你喜欢

热点阅读