- 存储过程和函数:一组预先编译好的SQL语句的集合,理解成批处理语句,类似于Java中的方法
- 好处
- 提高代码的重用性
- 简化操作
- 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
1 函数与存储过程的区别
- 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入或批量更新
- 函数:有且仅有一个返回,适合做处理数据后返回一个值
2 函数创建语法
CREATE FUNCTION 函数名(参数名 参数列表,...)RETURNS 返回类型
BEGIN
函数体
END
注意:
1. 函数体必须有RETURN
语句,且应该放在函数体最后,放在其他部位也不会保存,但是不建议且没有意义
2. 函数体只有一个语句时,BEGIN
和END
可以省略
3 函数调用语法
SELECT 函数名(参数列表)
4 函数的应用
# 1 无参有返回
# (1) 返回工资的员工数
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE num INT DEFAULT 0;
SELECT COUNT(*) INTO num FROM employees;
RETURN num;
END;
# 调用函数
SELECT myf1();
# 2 有参有返回
# (2) 根据员工名返回他的工资
CREATE FUNCTION myf2(`name` VARCHAR(20)) RETURNS DOUBLE
BEGIN
DECLARE salary DOUBLE DEFAULT 0;
SELECT emp.salary INTO salary FROM employees emp WHERE emp.last_name = `name`;
RETURN salary;
END;
# 调用函数
SELECT myf2('Abel');
# (3)根据部门名,返回该部门的平均工资
CREATE FUNCTION myf3(dep_name VARCHAR(20)) RETURNS DOUBLE
BEGIN
DECLARE avgSalary DOUBLE DEFAULT 0;
SELECT AVG(emp.salary) INTO avgSalary
FROM employees emp
INNER JOIN departments dep
ON emp.department_id = dep.department_id
WHERE dep.department_name = dep_name
GROUP BY emp.department_id;
RETURN avgSalary;
END;
SELECT myf3('IT');
5 函数的查看与删除
- 查看
SHOW CREATE FUNCTION 函数名;
- 删除
DROP FUNCTION 函数名;
所有创建的存储过程和函数都记录在MySQL库中的proc表中