MySQL学习-流程控制-IF与CASE语句

210 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

前言

上篇我们学习了MySQL中的定义条件和处理程序。有兴趣的小伙伴可以阅读(# MySQL学习-定义条件和处理程序)。
下面我们学习MySQL中的流程控制。

流程控制

开发中,有很多复杂的问题,这时需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分,流程分为三类:

  1. 顺序结构:程序从上往下依次执行。
  2. 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
  3. 循环结构:程序满足一定条件下,重复执行一组语句。

针对MySQL的流程控制语句主要有3类:注意:只能用于存储程序。

  1. 条件判断语句:IF和CASE语句。
  2. 循环语句:LOOP、WHILE和REPEAT语句。
  3. 跳转语句:ITERATE和LEAVE语句。

IF语句

语法:

IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]...
[ELSE 操作n]
END IF

根据表达式的结果为TRUE或FALSE执行相应的语句。这里的”[]“中的内容是可选的。

特点:

  1. 不同的表达式对应不同的操作
  2. 使用在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 表达式
WHEN1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN2 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 ;

今天先学习到这里,明天继续。