MySQL流程控制结构
一、MySQL流程控制
MySQL中的流程控制结构可分为3类如下:
- 顺序结构:就是按照顺序正常执行下去
- 分支结构:if、case等
- 循环结构:loop、while、repeat等
二、分支结构
2.1.IF函数
语法:
IF(expr1,expr2,expr3)
执行:如果expr1成立,执行expr2,否则执行expr3
2.2.CASE结构
2.2.1实现switch CASE 功能
语法:
CASE 变量|表达式|字段 WHEN 要判断的值1 THEN 返回的值1 WHEN 要判断的值2 THEN 返回的值2 ... ELSE 要返回的值n END
2.2.2.实现多重 IF
语法:
CASE WHEN 表达式1 THEN 返回的值1 WHEN 表达式2 THEN 返回的值2 ... ELSE 要返回的值n END
以上的CASE是作为表达式使用,表达式的结果是个值
2.2.3 实现 switch CASE 但以语句的形式存在,作为语句只能放在BEGIN END中
语法:
CASE 变量|表达式|字段 WHEN 要判断的值1 THEN 语句1; WHEN 要判断的值2 THEN 语句2; ... ELSE 语句n; END CASE;
2.2.4 实现多重 IF 但以语句的形式存在
语法:
CASE WHEN 表达式1 THEN 语句1; WHEN 表达式2 THEN 语句2; ... ELSE 语句n; END CASE;
特点:
CASE
结构作为独立语句时,只能放在BEGIN END
中ELSE
可以省略,但是不建议省略,默认是ELSE NULL
WHEN
中的条件满足,则执行THEN
后的语句,执行完结束,都不满足执行ELSE
后的语句
#案例1:创建存储过程,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D DELIMITER // CREATE PROCEDURE test1(IN scores INT) BEGIN CASE WHEN scores >= 90 AND scores <=100 THEN SELECT 'A'; WHEN scores >=80 THEN SELECT 'B'; WHEN scores >=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; # end case不能省略,表示结束循环 END // DELIMITER ; # 调用 CALL test1(74)
2.3.if结构(1.1是IF函数,注意区分)
-
功能:实现多重分支,仅能用在BEGIN END中
-
语法:(可以说是最像高级语言的IF结构)
IF 条件1 THEN 语句1; ELSEIF 条件2 THEN 语句2; ... ELSE 语句n; END IF;
案例2:使用if结构,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER // CREATE FUNCTION test2(scores INT(10)) RETURNS VARCHAR(1) READS SQL DATA BEGIN IF scores>=90 AND scores <= 100 THEN RETURN 'A'; ELSEIF scores >= 80 THEN RETURN 'B'; ELSEIF scores >= 60 THEN RETURN 'C'; ELSE RETURN 'D'; END IF; #必须添加 END// DELIMITER ;
案例3:使用if结构 创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
DROP PROCEDURE test3 DELIMITER // CREATE PROCEDURE test3(IN salary DOUBLE) BEGIN IF salary < 2000 THEN DELETE FROM employees WHERE employees.salary = salary; ELSEIF salary >= 2000 AND salary < 5000 THEN UPDATE employees SET salary = salary + 1000 WHERE employees.salary = salary; ELSE UPDATE employees SET salary = salary + 500 WHERE employees.salary = salary; END IF; END // DELIMITER ; # 调用 CALL test3(17000.00);
2.4.利用when case添加辅助列
利用薪资判断,划分薪资等级,形成辅助列
SELECT last_name, first_name, salary, (CASE WHEN salary>=10000 THEN '高' WHEN salary>=5000 THEN '中' WHEN salary>=3000 THEN '低' ELSE '补助' END) AS 薪资级别 FROM employees
执行如下:
但是需要注意的是上面添加的辅助列不能直接 用于来筛选,原因是where语句先执行,但是辅助列的sql还没有生成,所以出错,这时候可以把上面的sql当成一个表,再次筛选,筛选薪资级别为中的信息:
SELECT * FROM ( SELECT last_name, first_name, salary, (CASE WHEN salary>=10000 THEN '高' WHEN salary>=5000 THEN '中' WHEN salary>=3000 THEN '低' ELSE '补助' END) AS 薪资级别 FROM employees ) AS a WHERE a.薪资级别='中'
执行如下:
三、循环结构
MySQL中循环分类:
- while
- loop
- continue
循环终止控制:
iterate
:类似于continue
结束本次循环,继续下次循环leave
: 类似于break
结束当前的循环结构
2.1.while
语法:
[label:] WHILE 循环条件 DO 循环体; END WHILE [label]; -- label 是自己指定的某个标签名,标签结合iterate或leave控制循环的走向
2.2.loop
语法:
[label:] LOOP 循环体; END LOOP [label];
loop
可以用来模拟死循环
2.3 repeat
(类似DO{} WHILE() 至少执行一次)
语法:
[label:] REPEAT 循环体; UNTIL 结束循环的条件 END REPEAT [label ];
注意:标签主要用在循环控制条件上!!!
2.4.案例
1.实现批量插入,根据输入参数次数来插入到admin表中多条记录
# 1:实现批量插入,根据输入参数次数来插入到admin表中多条记录 DELIMITER // CREATE PROCEDURE test_while(IN num INT) BEGIN # 定义变量i DECLARE i INT DEFAULT 0; WHILE i<num DO INSERT INTO admin(username,password) VALUES('dzc','000'); SET i = i+1; END WHILE; END // DELIMITER ; //调用 CALL test_while(5)
2.使用leave,实现批量插入。当次数超过5时结束。
DELIMITER // CREATE PROCEDURE test_while2(IN num INT) BEGIN # 定义变量i DECLARE i INT DEFAULT 0; a:WHILE i<num DO INSERT INTO admin(username,password) VALUES('augus','000'); SET i = i+1; # 判断如果i大于等于5则结束循环,类似于break IF i>= 5 THEN LEAVE a; END IF; END WHILE a; # 结束语句 END// DELIMITER ; # 调用存储过程 CALL test_while2(15)
3.使用iterate,仅仅插入偶数编号的用户和密码
DELIMITER // CREATE PROCEDURE test_iterate(IN num INT) BEGIN # 定义变量i DECLARE i INT DEFAULT 0; a:WHILE i<num DO SET i = i+1; # 判断如果i取余等于0则, IF MOD(i,2) <> 0 THEN ITERATE a; END IF; INSERT INTO admin(username,password) VALUES(CONCAT('augus',i),'000'); END WHILE a; # 必须要写 END // DELIMITER ; //调用 CALL test_iterate(14)
具体解释如下:
MOD(i,2)
:这个函数表示取变量i
除以2的余数。IF MOD(i,2) <> 0
:这里判断如果i
除以2的余数不等于0,即i
为奇数时执行下面的操作。ITERATE a;
:这个语句的作用是跳过当前循环的剩余部分,继续下一次循环。在这里,如果i
为奇数,则会跳过插入记录的操作,直接进入下一次循环