IF 语句的语法结构是:

  1. IF 表达式1 THEN 操作1
  2. [ELSEIF 表达式2 THEN 操作2]……
  3. [ELSE 操作N]
  4. END IF

根据表达式的结果为TRUE或FALSE执行相应的语句。这里“[]”中的内容是可选的。
特点:① 不同的表达式对应不同的操作
② 使用在begin end中

举例1:

情况1:直接输出

DELIMITER //

CREATE PROCEDURE test_if1()
BEGIN    

    #声明局部变量
    declare stu_name varchar(15);

    if stu_name is null 
        then select 'stu_name is null';
    end if;

END //

DELIMITER ;

调用

CALL test_if1();

情况2:二选一

DELIMITER //

CREATE PROCEDURE test_if2()

BEGIN    
    #声明局部变量
    declare email varchar(25) default 'aaa';

    if email is null
        then select 'email is null';
    else
        select 'email is not null';
    end if;

END //

DELIMITER ;

调用

CALL test_if2();

情况3:多选一

DELIMITER //

CREATE PROCEDURE test_if3()

BEGIN    
    #声明局部变量
    DECLARE age INT DEFAULT 20;

    IF age > 40
        THEN SELECT '中老年';
    ELSEIF age > 18
        THEN SELECT '青壮年';
    ELSEIF age > 8
        THEN SELECT '青少年';
    ELSE
        SELECT '婴幼儿';
    END IF;

END //

DELIMITER ;

调用

CALL test_if3();

举例2:声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。

delimiter $

create procedure update_salary_by_eid1(in emp_id int)
begin
    declare emp_salary double;# 记录员工工资
    declare hire_year double; #记录员工入职工资年头

    #赋值
    select salary into emp_salary from emp where employee_id = emp_id;
    select datediff(curdate(),hire_date)/365 into hire_year from emp where employee_id = emp_id;


    if emp_salary <8000 and hire_year >= 5
        then update emp set salary = salary + 500 where employee_id = emp_id;
    end if;

end $

delimiter ;

调用

call update_salary_by_eid1(104);

举例3:声明存储过程“update_salary_by_eid2”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于9000元并且入职时间超过5年,就涨薪500元;否则就涨薪100元。

DELIMITER //

CREATE PROCEDURE update_salary_by_eid2(IN emp_id INT)
BEGIN
    #声明局部变量
    DECLARE emp_sal DOUBLE; #记录员工的工资
    DECLARE hire_year DOUBLE; #记录员工入职公司的年头


    #赋值
    SELECT salary INTO emp_sal 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_sal < 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 ;

调用

CALL update_salary_by_eid2(103);
CALL update_salary_by_eid2(104);

SELECT * FROM employees
WHERE employee_id IN (103,104);

举例4:声明存储过程“update_salary_by_eid3”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于9000元,就更新薪资为9000元;薪资如果大于等于9000元且低于10000的,但是奖金比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。

DELIMITER //
CREATE PROCEDURE update_salary_by_eid3(IN emp_id INT)
BEGIN
    #声明变量
    DECLARE emp_sal DOUBLE; #记录员工工资
    DECLARE bonus DOUBLE; #记录员工的奖金率

    #赋值
    SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
    SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;


    #判断
    IF emp_sal < 9000 
        THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
    ELSEIF emp_sal < 10000 AND bonus IS NULL
        THEN UPDATE employees SET commission_pct = 0.01 WHERE employee_id = emp_id;
    ELSE 
        UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
    END IF;

END //


DELIMITER ;

调用

CALL update_salary_by_eid3(102);
CALL update_salary_by_eid3(103);
CALL update_salary_by_eid3(104);

SELECT *
FROM employees
WHERE employee_id IN (102,103,104);