一、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
为奇数,则会跳过插入记录的操作,直接进入下一次循环