函数和存储过程非常类似,它们的区别是:
- 存储过程可以有0个返回值,也可以有多个返回值。
- 函数必须且只能有1个返回值
- 存储过程适合于批量的插入、更新等
- 函数适合做处理后返回一个结果
- 存储过程调用关键字是 call
- 函数调用关键字是:select
一、函数创建、调用、查看和删除
1、创建语法
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
- 参数部分:参数名、参数类型
- 函数体中一定要有return语句,否则会报错
- 注意参数列表后面的返回关键字是 returns ,而不是 return
- 函数体中的返回关键字是 return,而不是 returns
- 当函数体中只有一句话时,可以省略begin end
- delimiter来设置结束符
2、调用语法
select 函数名(参数列表)
3、查看函数
show create function 函数名;
4、删除函数
drop function 函数名;
二、应用实例
【注】:在开头的返回类型后需要加上 DETERMINISTIC、NO SQL、READS SQL DATA 中的一个
1、创建函数,实现传入两个float,返回两者之和
CREATE FUNCTION myfunc(a FLOAT,b FLOAT) RETURNS FLOAT DETERMINISTIC
BEGIN
RETURN a+b;
END $
SELECT myfunc(10,20)$
2、无参函数:返回公司员工个数
# 创建函数
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT DETERMINISTIC
BEGIN
DECLARE res INT DEFAULT 0; # 定义变量
SELECT COUNT(*) INTO res # 给变量赋值
FROM employees;
RETURN res;
END $
# 调用函数
SELECT myf1() $
3、有参函数:根据员工名,返回其工资
CREATE FUNCTION myf2(tname VARCHAR(20)) RETURNS DOUBLE DETERMINISTIC
BEGIN
DECLARE tsalary DOUBLE DEFAULT 0;
SELECT salary INTO tsalary
FROM employees
WHERE last_name=tname;
RETURN tsalary;
END $
SELECT myf2('Ozer') $
4、根据部门名,返回该部门的平均工资
CREATE FUNCTION myf3(depName VARCHAR(20)) RETURNS DOUBLE DETERMINISTIC
BEGIN
SET @res:=0;
SELECT AVG(salary) INTO @res
FROM employees e
JOIN departments d ON e.department_id=d.department_id
WHERE d.department_name=depName;
RETURN @res;
END $
SELECT myf3('IT') $