【DataBase】MySQL 28 流程控制
一、分支结构
1、IF函数
语法:
IF(表达式1, 表达式2, 表达式3)
类似三元运算符,表达式1返回True Or False
True执行表达式2,False执行表达式3
IF实现多分枝结构
IF 条件 THEN 语句; ELSEIF 条件 THEN 语句; ELSEIF 条件 THEN 语句; ... ... ELSE 语句; END IF;
只能应用在BEGIN & END 中
2、CASE结构
用于等值判断处理,也可以多判断处理
CASE 变量、字段、函数、表达式
WHEN 要判断的值1 THEN 返回值1或者语句 WHEN 要判断的值2 THEN 返回值2或者语句 WHEN 要判断的值3 THEN 返回值3或者语句 ... ... ELSE 返回值N或者语句
END
不是等值判断,以条件判断的语法:
CASE WHEN 条件1 THEN 返回值1或者语句 WHEN 条件2 THEN 返回值2或者语句 WHEN 条件3 THEN 返回值3或者语句 ... ... ELSE 返回值N或者语句 END
二、分支案例:
成绩分级
DELIMITER $ CREATE PROCEDURE scoreCase(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 scoreCase(77);
使用多重IF
DELIMITER $ CREATE FUNCTION scoreByIf(score INT) RETURNS CHAR 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 scoreByIf(80)
三、循环结构
三种循环类型:
WHILE、LOOP、REPEAT
循环控制:
iterate == continue 继续,结束本次循环,进入下一次循环
leave == break ,跳出当前的循环
WHILE语法:
[标签 :] WHILE 循环条件 DO 循环体内的逻辑 END WHILE [标签];
LOOP语法:
[标签 :] LOOP 循环体内的逻辑 END LOOP[标签];
REPEAT语法:
[标签 :] REPEAT 循环体内的逻辑 UTIL 结束循环的条件 END REPEAT [标签];
四、循环案例:
批量插入ADMIN表中
DELIMITER $; CREATE PROCEDURE batchByWhile(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; WHILE i <= insertCount DO INSERT INTO admin(`username`,`password`) VALUES('AAAA','1122'); SET i = i + 1; END WHILE; END
调用
CALL batchByWhile(777);
带标签的处理:
TRUNCATE admin; DELIMITER $; CREATE PROCEDURE batchByWhile2(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; r1:WHILE i <= insertCount DO INSERT INTO admin(`username`,`password`) VALUES('AAAA','1122'); IF i >= 30 THEN LEAVE r1; END IF; SET i = i + 1; END WHILE r1; END $
调用:
CALL batchByWhile2(100);
使用迭代处理:
DELIMITER $; CREATE PROCEDURE batchByWhile3(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; r1:WHILE i <= insertCount DO SET i = i + 1; IF MOD(i, 2) != 0 THEN ITERATE r1; END IF; INSERT INTO admin(`username`,`password`) VALUES('AAAA','1122'); END WHILE r1; END $
调用
CALL batchByWhile3(222);