MySQL除了内置了丰富的函数方便用户调用外,还支持用户进行自定义函数。自定义函数与存储过程类似,也是一组预先编译好的SQL语句的集合。但是自定义函数和存储过程还是有着较大的区别:存储过程可以没有返回值,或者有多个返回值,一般用来实现批量插入、批量更新等操作;自定义函数有且仅有一个返回值,因此适合用于处理数据后返回一个特定的结果。
函数创建
MySQL中自定义函数的语法如下所示:
CREATE FUNCTION '函数名称'('参数1' '参数1类型', '参数2' '参数2类型', ... ) RETURNS '返回值类型'
BEGIN
DECLARE '变量名' '变量类型' default '变量默认值';
SET '参数设置';
'SQL语句';
RETURN 返回值;
END;
我以Leetcode中的177. 第N高的薪水为例,演示一下自定义函数的创建。该题要求从下面这个表中查找出薪资排名第N的人的薪资:
Create table If Not Exists Employee (Id int, Salary int)
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
下面是关于这题的一种解答,可以通过如下的自定义函数来实现:
--创建一个函数返回排名第N的薪水
CREATE FUNCTION getNthHighestSalary(--定义函数名称
N INT --定义函数入参名称及类型
) RETURNS INT --定义函数返回值类型
BEGIN -- 标识函数体开始
DECLARE ans INT default NULL; --定义一个整型变量,用于保存最后的结果,默认为null
SET N = N - 1; --设置参数值,将原值-1
--SQL语句
SELECT DISTINCT salary INTO ans--将SELECT的结果赋值给变量ans
FROM Employee
ORDER BY salary DESC LIMIT N,1;
RETURN ans; --返回函数结果
END; -- 标识函数体结束
函数调用
select '函数名称'('参数列表')
比如上面我们定义的求第N高薪水的函数的调用方式如下:
select getNthHighestSalary(3)
查看、删除
查看和删除自定义函数的语法如下所示:
show create function '函数名称'
drop function '函数名称'
网友评论