前言:函数的含义以及与存储过程的异同
-
从含义上,几乎等同于存储过程
-
不同之处在于:
存储过程
:可以有0个返回值,也可以有多个返回值,适合做批量插入、批量更新
函数
:必须有且仅有一个返回值,适合做处理数据后返回一个结果 -
调用方式也不一样:
存储过程
:CALL
函数
: SELECT
一、函数的创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
1.参数列表包含两部分:参数名 参数类型
2.函数体:必须有return
语句,没有就报错;建议将return
放置在函数体末尾
3.函数体中仅有一句话时,可以省略begin end
4.使用delimiter
语句设置结束标记
二、函数调用
SELECT 函数名(实际参数)
含义
:执行select中的SQL语句,并显示返回值
2.1 无参数有返回
案例
1:返回公司的总人数
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;
SELECT COUNT(*) INTO c
FROM employees;
RETURN c;
END $
SELECT myf1()$
案例
2:根据员工名返回他的工资
CREATE FUNCTION myf2(iname VARCHAR(20)) RETURNS DOUBLE
BEGIN
#declare sal double default 0;
SET @sal = 0;
SELECT salary INTO @sal
FROM employees e
WHERE e.last_name = iname
LIMIT 1;
RETURN @sal;
END $
SELECT myf2()$
案例
3:根据部门名,返回部门的平均工资
CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @res=0;
SELECT AVG(salary) INTO @res
FROM employees e
GROUP BY e.department_id
HAVING e.department_id = (
SELECT department_id FROM departments d
WHERE d.department_name = deptName
LIMIT 1; -- #如果搜索的部门编号不止一个,就选择头一个
);
RETURN @res;
END $
SELECT myf3('Shi') $
案例
3的第二种解法:
CREATE FUNCTION myf4(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN
DECLARE res DOUBLE DEFAULT 0;
SELECT AVG(salary) INTO res
FROM employees e
INNER JOIN departments d ON d.department_id = e.department_id
WHERE d.department_name = deptName;
RETURN res;
END $
SELECT myf4('shi') $
三、查看函数
SHOW CREATE FUNCTION 函数名;
或者
在mysql数据库中的proc表中查看也即:-->服务器-->Database(mysql)-->Table(proc)
案例
:
SHOW CREATE FUNCTION myf4;
四、删除函数
DROP FUNCTION 函数名;
DROP FUNCTION myf4;