分支结构
分支结构主要有两种类型:IF THEN 与 CASE WHEN
1.IF THEN
简单示例:
1 DELIMITER // 2 3 CREATE PROCEDURE test_if() 4 5 BEGIN 6 DECLARE age INT DEFAULT 20; 7 8 IF age > 40 9 THEN SELECT '中老年'; 10 ELSEIF age > 18 11 THEN SELECT '青壮年'; 12 ELSEIF age > 8 13 THEN SELECT '青少年'; 14 ELSE 15 SELECT '婴幼儿'; 16 END IF; 17 18 19 END // 20 21 DELIMITER ;
语句总体结构 :IF 条件 THEN SELECT 该条件下对应的结果
ELSE IF 条件 THEN SELECT 该条件下对应的结果
ELSE SELECT 该条件下对应的结果
END IF;
综合实例应用:
1 #举例2:声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。 2 #判断该员工薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。 3 4 DELIMITER // 5 6 CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT) 7 BEGIN 8 #声明局部变量 9 DECLARE emp_sal DOUBLE; #记录员工的工资 10 DECLARE hire_year DOUBLE; #记录员工入职公司的年头 11 12 13 #赋值 14 SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id; 15 16 SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year FROM employees WHERE employee_id = emp_id; 17 18 #判断 19 IF emp_sal < 8000 AND hire_year >= 5 20 THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id; 21 END IF; 22 END // 23 24 DELIMITER ;
2.CASE WHEN
简单示例:
1.CASE... WHEN ... WHEN...类型:
1 DELIMITER // 2 CREATE PROCEDURE test_case() 3 BEGIN 4 #演示1:case ... when ...then ... 5 declare var int default 2; 6 7 case var 8 when 1 then select 'var = 1'; 9 when 2 then select 'var = 2'; 10 when 3 then select 'var = 3'; 11 else select 'other value'; 12 end case; 13 END // 14 DELIMITER;
基本结构 CASE 要判断的数据 WHEN 判断的数据应等于的数据 THEN SELECT 对应条件下的操作结果
WHEN 判断的数据应等于的数据 THEN SELECT 对应条件下的操作结果
ELSE SELECT 对应条件下的操作结果
END CASE;
2.CASE WHEN... WHEN类型:
1 DELIMITER // 2 CREATE PROCEDURE test_case() 3 BEGIN 4 #演示2:case when ... then .... 5 DECLARE var1 INT DEFAULT 10; 6 CASE 7 WHEN var1 >= 100 THEN SELECT '三位数'; 8 WHEN var1 >= 10 THEN SELECT '两位数'; 9 ELSE SELECT '个数位'; 10 END CASE; 11 12 END // 13 14 DELIMITER ;
基本结构 CASE WHEN 判断的条件 THEN SELECT 对应条件下的操作结果
WHEN 判断的条件 THEN SELECT 对应条件下的操作结果
ELSE SELECT 对应条件下的操作结果
END CASE;
综合应用:
1 #举例2:声明存储过程“update_salary_by_eid4”,定义IN参数emp_id,输入员工编号。 2 #判断该员工薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的, 3 #但是奖金比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。 4 5 DELIMITER // 6 CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT) 7 BEGIN 8 #局部变量的声明 9 DECLARE emp_sal DOUBLE; #记录员工的工资 10 DECLARE bonus DOUBLE; #记录员工的奖金率 11 12 #局部变量的赋值 13 SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id; 14 SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id; 15 16 CASE 17 WHEN emp_sal < 9000 THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id; 18 WHEN emp_sal < 10000 AND bonus IS NULL THEN UPDATE employees SET commission_pct = 0.01 19 WHERE employee_id = emp_id; 20 ELSE UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id; 21 END CASE; 22 23 24 END // 25 26 DELIMITER ;
1 #举例3:声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。 2 #判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100; 3 #如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500。 4 5 DELIMITER // 6 7 CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT) 8 BEGIN 9 #声明局部变量 10 DECLARE hire_year INT; #记录员工入职公司的总时间(单位:年) 11 12 #赋值 13 SELECT ROUND(DATEDIFF(CURDATE(),hire_date) / 365) INTO hire_year 14 FROM employees WHERE employee_id = emp_id; 15 16 #判断 17 CASE hire_year 18 WHEN 0 THEN UPDATE employees SET salary = salary + 50 WHERE employee_id = emp_id; 19 WHEN 1 THEN UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id; 20 WHEN 2 THEN UPDATE employees SET salary = salary + 200 WHERE employee_id = emp_id; 21 WHEN 3 THEN UPDATE employees SET salary = salary + 300 WHERE employee_id = emp_id; 22 WHEN 4 THEN UPDATE employees SET salary = salary + 400 WHERE employee_id = emp_id; 23 ELSE UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id; 24 END CASE; 25 END // 26 27 DELIMITER ;
总结:无论是IF语句还是CASE语句,在结束时都不要忘记END IF/CASE;表示这个分支语句结构的结束