MySQL存储函数是存储在数据库服务器端的一段SQL代码集合,它接收输入参数,执行预设的逻辑操作后返回一个单一的结果值,属于MySQL可编程对象的一种。存储函数可以在SQL语句中像内置函数一样被直接调用,能够有效减少重复代码编写,提升业务逻辑的一致性。

MySQL存储函数的核心特性
和存储过程相比,存储函数有以下几个明显的特征:
- 必须返回一个值,且返回值类型需要在创建时明确声明
- 函数体中不能包含返回结果集的语句,比如
SELECT查询没有INTO子句的情况 - 可以直接在
SELECT、WHERE、INSERT等SQL语句中调用 - 参数只能是输入参数,不支持输出参数和输入输出参数
存储函数的创建语法
创建MySQL存储函数的基本语法如下:
CREATE FUNCTION 函数名(参数名 参数类型 [, 参数名 参数类型 ...])
RETURNS 返回值类型
[函数特性]
BEGIN
-- 函数逻辑代码
RETURN 返回值;
END;
其中函数特性可选,常见取值包括:
DETERMINISTIC:表示函数是确定性的,相同输入参数总是返回相同结果NO SQL:表示函数不包含SQL语句READS SQL DATA:表示函数包含读取数据的SQL语句MODIFIES SQL DATA:表示函数包含修改数据的SQL语句
创建存储函数的实操示例
下面通过一个计算用户等级的例子来演示存储函数的创建过程,假设我们有一个用户表user_info,其中score字段代表用户的积分,规则是积分大于等于90为等级A,大于等于60为等级B,其余为等级C。
首先创建测试表并插入测试数据:
-- 创建用户表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
score INT NOT NULL
);
-- 插入测试数据
INSERT INTO user_info (username, score) VALUES
('张三', 95),
('李四', 78),
('王五', 52);
接下来创建计算用户等级的存储函数:
-- 切换结束符,避免和函数体中的分号冲突
DELIMITER //
-- 创建存储函数
CREATE FUNCTION get_user_level(user_score INT)
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
DECLARE user_level VARCHAR(10);
-- 根据积分判断等级
IF user_score >= 90 THEN
SET user_level = 'A';
ELSEIF user_score >= 60 THEN
SET user_level = 'B';
ELSE
SET user_level = 'C';
END IF;
RETURN user_level;
END //
-- 恢复默认结束符
DELIMITER ;
函数创建完成后,就可以在SQL语句中直接调用了:
-- 查询所有用户的姓名、积分和对应等级 SELECT username, score, get_user_level(score) AS user_level FROM user_info;
执行上述查询后,会得到如下结果:
| username | score | user_level |
|---|---|---|
| 张三 | 95 | A |
| 李四 | 78 | B |
| 王五 | 52 | C |
存储函数的查看与删除
如果需要查看已经创建的存储函数,可以使用以下语句:
-- 查看当前数据库下所有存储函数 SHOW FUNCTION STATUS WHERE Db = DATABASE(); -- 查看指定函数的定义语句 SHOW CREATE FUNCTION get_user_level;
如果不再需要某个存储函数,可以使用DROP FUNCTION语句删除:
DROP FUNCTION IF EXISTS get_user_level;
使用存储函数的注意事项
- 创建存储函数时,如果开启了二进制日志,需要指定
DETERMINISTIC或者NO SQL等特性,否则可能会创建失败 - 函数体中如果包含修改数据的操作,比如
INSERT、UPDATE、DELETE,需要谨慎使用,避免在不经意间修改数据 - 存储函数的逻辑不宜过于复杂,否则会影响SQL语句的执行效率,复杂逻辑建议使用存储过程实现
- 修改存储函数需要先删除再重新创建,MySQL不支持直接修改存储函数的定义