mysql 流程控制语句
2023-03-14 本文已影响0人
暴躁程序员
一、mysql 条件语句
1. if() 函数
- 语法
IF(expr1,expr2,expr3) -- 如果expr1成立,那么执行expr2,否则执行expr3,类似三元运算
- 示例:
SELECT IF(1=1,2,3) -- 结果:2
2. if else 语句
注意事项:IF 结构作为独立的语句使用必须放在 begin end 中,结束语句用 END IF;
- 语法
IF 表达式语句1 THEN 执行体1;
ELSEIF 表达式语句2 THEN 执行体2;
ELSEIF 表达式语句3 THEN 执行体3;
...
ELSE 执行体;
END IF;
- 示例:格式化年龄段
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 后面,如果是返回值则不加分号,如果是表达式语句则加分号;
- 等值判断语法
CASE 表达式或者字段
WHEN 比较的值1 THEN 返回值1或语句
WHEN 比较的值2 THEN 返回值2或语句
...
ELSE 返回值或语句
END CASE; -- 如果 case 作为表达式嵌套在 select 语句中结束语句用 end
- 等值判断示例:格式化性别
-- 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);
- 区间判断语法
CASE
WHEN 条件表达式1 THEN 返回值或语句
WHEN 条件表达式2 THEN 返回值或语句
...
ELSE 返回值或语句
END CASE; -- 如果 case 作为表达式嵌套在 select 语句中结束语句用 end
- 区间判断示例:格式化年龄段
-- 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 循环(先判断后循环)
- 语法
标签: while 循环条件 do 循环体 end while 标签;
- 示例:向用户表中批量插入 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 循环(先循环后判断)
- 语法
标签:repeat 循环体 until 结束循环的条件 end repeat 标签;
- 示例:向用户表中批量插入 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使用)
- 语法
标签: loop 循环体 end loop 标签;
- 示例:向用户表中批量插入 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 跳过和终止循环语句
- iterate 跳过
结束本次循环,继续下次循环,相当于JavaScript中的 continue,可搭配标签使用 - leave 终止
结束当前循环,相当于JavaScript中的 break,可搭配标签使用