if

基本语法

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

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

  • ① 不同的表达式对应不同的操作
  • ② 使用在begin end中

    例子

    ```sql DELIMITER //

CREATE PROCEDURE test_if()

BEGIN

  1. #情况1:
  2. #声明局部变量

— declare stu_name varchar(15);

— if stu_name is null — then select ‘stu_name is null’; — end if;

  1. #情况2:二选一

— declare email varchar(25) default ‘aaa’;

— if email is null — then select ‘email is null’; — else — select ‘email is not null’; — end if;

  1. #情况3:多选一
  2. DECLARE age INT DEFAULT 20;
  3. IF age > 40
  4. THEN SELECT '中老年';
  5. ELSEIF age > 18
  6. THEN SELECT '青壮年';
  7. ELSEIF age > 8
  8. THEN SELECT '青少年';
  9. ELSE
  10. SELECT '婴幼儿';
  11. END IF;

END //

DELIMITER ;

调用

CALL test_if();

DROP PROCEDURE if exists test_if;

  1. 需求:<br />声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。
  2. ```sql
  3. DELIMITER //
  4. CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT)
  5. BEGIN
  6. #声明局部变量
  7. DECLARE emp_sal DOUBLE; #记录员工的工资
  8. DECLARE hire_year DOUBLE; #记录员工入职公司的年头
  9. #赋值
  10. SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
  11. SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year FROM employees WHERE employee_id = emp_id;
  12. #判断
  13. IF emp_sal < 8000 AND hire_year >= 5
  14. THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
  15. END IF;
  16. END //
  17. DELIMITER ;
  18. #调用存储过程
  19. CALL update_salary_by_eid1(104);
  20. SELECT DATEDIFF(CURDATE(),hire_date)/365, employee_id,salary
  21. FROM employees
  22. WHERE salary < 8000 AND DATEDIFF(CURDATE(),hire_date)/365 >= 5;
  23. DROP PROCEDURE update_salary_by_eid1;

case

语法

CASE 语句的语法结构1:

  1. #情况一:类似于switch
  2. CASE 表达式
  3. WHEN 1 THEN 结果1或语句1(如果是语句,需要加分号)
  4. WHEN 2 THEN 结果2或语句2(如果是语句,需要加分号)
  5. ...
  6. ELSE 结果n或语句n(如果是语句,需要加分号)
  7. END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

CASE 语句的语法结构2:

  1. #情况二:类似于多重if
  2. CASE
  3. WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
  4. WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
  5. ...
  6. ELSE 结果n或语句n(如果是语句,需要加分号)
  7. END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

例子

  1. DELIMITER //
  2. CREATE PROCEDURE test_case()
  3. BEGIN
  4. #演示1:case ... when ...then ...
  5. declare var int default 2;
  6. case var
  7. when 1 then select 'var = 1';
  8. when 2 then select 'var = 2';
  9. when 3 then select 'var = 3';
  10. else select 'other value';
  11. end case;
  12. /*#演示2:case when ... then ....
  13. DECLARE var1 INT DEFAULT 10;
  14. CASE
  15. WHEN var1 >= 100 THEN SELECT '三位数';
  16. WHEN var1 >= 10 THEN SELECT '两位数';
  17. ELSE SELECT '个数位';
  18. END CASE;*/
  19. END //
  20. DELIMITER ;
  21. #调用
  22. CALL test_case();
  23. DROP PROCEDURE test_case;

需求:
声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500。

  1. DELIMITER //
  2. CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT)
  3. BEGIN
  4. #声明局部变量
  5. DECLARE hire_year INT; #记录员工入职公司的总时间(单位:年)
  6. #赋值
  7. SELECT ROUND(DATEDIFF(CURDATE(),hire_date) / 365) INTO hire_year
  8. FROM employees WHERE employee_id = emp_id;
  9. #判断
  10. CASE hire_year
  11. WHEN 0 THEN UPDATE employees SET salary = salary + 50 WHERE employee_id = emp_id;
  12. WHEN 1 THEN UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
  13. WHEN 2 THEN UPDATE employees SET salary = salary + 200 WHERE employee_id = emp_id;
  14. WHEN 3 THEN UPDATE employees SET salary = salary + 300 WHERE employee_id = emp_id;
  15. WHEN 4 THEN UPDATE employees SET salary = salary + 400 WHERE employee_id = emp_id;
  16. ELSE UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
  17. END CASE;
  18. END //
  19. DELIMITER ;
  20. #调用
  21. CALL update_salary_by_eid5(101);
  22. SELECT *
  23. FROM employees
  24. DROP PROCEDURE update_salary_by_eid5;