在 MySQL 中,添加函数(Function)指的是创建一个用户自定义函数(User-Defined Function, UDF),它类似于内置函数(如 CONCAT()、NOW()),可以接收参数并返回一个值(通常是标量值,不是表)。
MySQL 支持两种主要的自定义函数类型:
类型 | 说明 | 是否需要编译 | 是否本文重点 |
|---|---|---|---|
1. 标量函数(Scalar Functions) | 接收输入参数,返回单个值(如数字、字符串等)。类似内置函数 CONCAT(), NOW()等。 | ❌ 不需要编译(如果你用 MySQL 内置的创建方式)✅ 但如果你的函数是用 C/C++ 编写的,则需要编译为动态库并安装 | ✅ 本文重点:用 SQL 创建 |
2. 存储函数(Stored Functions) | 其实是 MySQL 提供的在 SQL 中定义的函数,属于存储程序的一种,使用 CREATE FUNCTION语句创建,返回一个标量值,可以在 SQL 语句中像内置函数一样调用 | ❌ 不需要编译,纯 SQL 实现 | ✅ 本文重点:常用方式 |
3. 用户自定义 C 函数(Native UDF,用 C/C++ 编写) | 需要用 C/C++ 编写,编译成 .so(Linux)或 .dll(Windows)动态库,然后通过 CREATE FUNCTION ... SONAME安装到 MySQL 中 | ✅ 需要编译和安装二进制库 | ⚠️ 高级用法,非本文重点 |
✅ 本文主要介绍第 2 种:使用 SQL 语句创建的【存储函数 / 标量函数】,也就是
CREATE FUNCTION的常规用法,无需编程或编译。
CREATE FUNCTION 函数名([参数1 类型, 参数2 类型, ...])
RETURNS 返回类型
DETERMINISTIC | NOT DETERMINISTIC
[READS SQL DATA | MODIFIES SQL DATA | ...]
BEGIN
-- 函数体
RETURN 值;
END;函数名:你定义的函数名称,如 my_add、get_greeting参数:可选,可以有多个输入参数,如 a INT, b INTRETURNS 类型:函数必须指定返回的数据类型,如 INT, VARCHAR(255), DECIMAL(10,2)等DETERMINISTIC:表示相同的输入总是返回相同的输出,可优化性能(如纯计算函数)。如果不是确定的,用 NOT DETERMINISTICBEGIN ... END包裹,里面写实现逻辑,必须用 RETURN返回一个值因为函数体有多条 SQL 语句(包括 BEGIN, RETURN, END),我们需要临时修改 MySQL 的语句结束符,避免与函数体中的分号冲突。
DELIMITER //CREATE FUNCTION add_two_numbers(a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN a + b;
END //DELIMITER ;SELECT add_two_numbers(10, 20); -- 返回 30DELIMITER //
CREATE FUNCTION greet(name VARCHAR(100))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
RETURN CONCAT('Hello, ', name);
END //
DELIMITER ;调用:
SELECT greet('Alice'); -- 返回 'Hello, Alice'DELIMITER //
CREATE FUNCTION get_grade(score INT)
RETURNS CHAR(2)
DETERMINISTIC
BEGIN
DECLARE grade CHAR(2);
IF score >= 90 THEN
SET grade = 'A';
ELSEIF score >= 80 THEN
SET grade = 'B';
ELSEIF score >= 70 THEN
SET grade = 'C';
ELSE
SET grade = 'D';
END IF;
RETURN grade;
END //
DELIMITER ;调用:
SELECT get_grade(85); -- 返回 'B'
SELECT get_grade(95); -- 返回 'A'SHOW FUNCTION STATUS;SHOW CREATE FUNCTION 函数名;例如:
SHOW CREATE FUNCTION add_two_numbers;使用 DROP FUNCTION:
DROP FUNCTION IF EXISTS 函数名;例如:
DROP FUNCTION IF EXISTS add_two_numbers;注意事项 | 说明 |
|---|---|
函数 vs 存储过程 | 函数 必须有返回值(RETURN),且一般用于表达式中;存储过程(CREATE PROCEDURE)可以没有返回值,通常用于执行一组操作,用 CALL调用 |
函数中不能执行某些 SQL 语句 | 如不能单独执行 INSERT/ UPDATE/ DELETE等(除非函数声明为 MODIFIES SQL DATA,但一般不建议在函数中做 DML) |
函数用于 SELECT / WHERE 等 SQL 语句中 | 因为它有返回值,类似内置函数,比如:SELECT name, get_grade(score) FROM students; |
DELIMITER 必须设置 | 定义函数时因为有多条语句,必须临时修改语句结束符,通常是改为 //或 $$ |
权限问题 | 创建函数可能需要 CREATE ROUTINE权限,某些环境(如云数据库)可能限制此功能 |
没有搜到相关的文章