if
基本语法
IF 表达式1 THEN 操作1[ELSEIF 表达式2 THEN 操作2]……[ELSE 操作N]END IF
根据表达式的结果为TRUE或FALSE执行相应的语句。这里“[]”中的内容是可选的。
特点:
CREATE PROCEDURE test_if()
BEGIN
#情况1:#声明局部变量
— declare stu_name varchar(15);
— if stu_name is null — then select ‘stu_name is null’; — end if;
#情况2:二选一
— declare email varchar(25) default ‘aaa’;
— if email is null — then select ‘email is null’; — else — select ‘email is not null’; — end if;
#情况3:多选一DECLARE age INT DEFAULT 20;IF age > 40THEN SELECT '中老年';ELSEIF age > 18THEN SELECT '青壮年';ELSEIF age > 8THEN SELECT '青少年';ELSESELECT '婴幼儿';END IF;
END //
DELIMITER ;
调用
CALL test_if();
DROP PROCEDURE if exists test_if;
需求:<br />声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。```sqlDELIMITER //CREATE PROCEDURE update_salary_by_eid1(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 < 8000 AND hire_year >= 5THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;END IF;END //DELIMITER ;#调用存储过程CALL update_salary_by_eid1(104);SELECT DATEDIFF(CURDATE(),hire_date)/365, employee_id,salaryFROM employeesWHERE salary < 8000 AND DATEDIFF(CURDATE(),hire_date)/365 >= 5;DROP PROCEDURE update_salary_by_eid1;
case
语法
CASE 语句的语法结构1:
#情况一:类似于switchCASE 表达式WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)...ELSE 结果n或语句n(如果是语句,需要加分号)END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
CASE 语句的语法结构2:
#情况二:类似于多重ifCASEWHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)...ELSE 结果n或语句n(如果是语句,需要加分号)END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
例子
DELIMITER //CREATE PROCEDURE test_case()BEGIN#演示1:case ... when ...then ...declare var int default 2;case varwhen 1 then select 'var = 1';when 2 then select 'var = 2';when 3 then select 'var = 3';else select 'other value';end case;/*#演示2:case when ... then ....DECLARE var1 INT DEFAULT 10;CASEWHEN var1 >= 100 THEN SELECT '三位数';WHEN var1 >= 10 THEN SELECT '两位数';ELSE SELECT '个数位';END CASE;*/END //DELIMITER ;#调用CALL test_case();DROP PROCEDURE test_case;
需求:
声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500。
DELIMITER //CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT)BEGIN#声明局部变量DECLARE hire_year INT; #记录员工入职公司的总时间(单位:年)#赋值SELECT ROUND(DATEDIFF(CURDATE(),hire_date) / 365) INTO hire_yearFROM employees WHERE employee_id = emp_id;#判断CASE hire_yearWHEN 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;WHEN 3 THEN UPDATE employees SET salary = salary + 300 WHERE employee_id = emp_id;WHEN 4 THEN UPDATE employees SET salary = salary + 400 WHERE employee_id = emp_id;ELSE UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;END CASE;END //DELIMITER ;#调用CALL update_salary_by_eid5(101);SELECT *FROM employeesDROP PROCEDURE update_salary_by_eid5;
