一、分支结构
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);