携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
前言
上篇我们学习了MySQL中的定义条件和处理程序。有兴趣的小伙伴可以阅读(# MySQL学习-定义条件和处理程序)。
下面我们学习MySQL中的流程控制。
流程控制
开发中,有很多复杂的问题,这时需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分,流程分为三类:
- 顺序结构:程序从上往下依次执行。
- 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
- 循环结构:程序满足一定条件下,重复执行一组语句。
针对MySQL的流程控制语句主要有3类:注意:只能用于存储程序。
- 条件判断语句:IF和CASE语句。
- 循环语句:LOOP、WHILE和REPEAT语句。
- 跳转语句:ITERATE和LEAVE语句。
IF语句
语法:
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]...
[ELSE 操作n]
END IF
根据表达式的结果为TRUE或FALSE执行相应的语句。这里的”[]“中的内容是可选的。
特点:
- 不同的表达式对应不同的操作
- 使用在BEGIN END中
举例一
IF val IS NULL
THEN SELECT 'val is null';
ELSE SELECT 'val is not null';
END IF;
举例二
创建存储过程update_salary_by_eid,定义IN参数emp_id,输入员工编号。判断该员工的薪资如果低于9000并且入职时间超过5年,就涨薪500,否则涨薪100。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid(IN emp_id INT)
BEGIN
DECLARE emp_salary DOUBLE;
DECLARE hire_year DOUBLE;
SELECT salary INTO emp_salary
FROM employees
WHERE employee_id = emp_id;
SELECT DATEDIFF(CURDATE(), hire_date)/365 INTO hire_year
FROM employees WHERE employee_id = emp_id;
IF emp_salary < 9000 AND hire_year > 5
THEN UPDATE employees SET salary = salary + 500
WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary = salary + 100
WHERE employee_id = emp_id;
END IF;
END //
DELIMITER ;
CASE语句
语法1:
CASE 表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在SELECT后面不需要)
语法2:
CASE
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在SELECT后面不需要)
举例一
判断val值等于1,或等于2,或者两者都不等。
CASE val
WHEN 1 THEN SELECT 'val is 1';
WHEN 2 THEN SELECT 'val is 2';
ELSE SELECT 'val is not 1 or 2';
END CASE;
举例二
创建存储过程update_salary_by_eid,定义IN参数emp_id,输入员工编号。判断该员工的入职年限,如果是0年,薪资涨50,如果是1年,薪资涨100,如果是2年,薪资涨200,其他涨薪500。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid(IN emp_id INT)
BEGIN
DECLARE emp_salary DOUBLE;
DECLARE hire_year DOUBLE;
SELECT salary INTO emp_salary
FROM employees
WHERE employee_id = emp_id;
SELECT ROUND(DATEDIFF(CURDATE(), hire_date)/365) INTO hire_year
FROM employees
WHERE employee_id = emp_id;
CASE hire_year
WHEN 0
THEN UPDATE employees SET salary = salary + 50
WHERE employee_id = emp_id;
WHEN 1
THEN UPDATE employees SET salary = salary + 100
WHERE employee_id = emp_id;
WHEN 2
THEN UPDATE employees SET salary = salary + 200
WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary = salary + 500
WHERE employee_id = emp_id;
END CASE;
END //
DELIMITER ;
今天先学习到这里,明天继续。