首页
学习
活动
专区
圈层
工具
发布

在mysql中如何添加函数

在 MySQL 中,​​添加函数(Function)​​指的是创建一个​​用户自定义函数(User-Defined Function, UDF)​​,它类似于内置函数(如 CONCAT()、NOW()),可以接收参数并返回一个值(通常是标量值,不是表)。

MySQL 支持两种主要的自定义函数类型:


一、MySQL 自定义函数(User-Defined Function, UDF)的两种类型

类型

说明

是否需要编译

是否本文重点

​​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的常规用法,无需编程或编译。​​


二、使用 SQL 创建 MySQL 函数(存储函数 / 标量函数)

语法:

代码语言:javascript
代码运行次数:0
复制
CREATE FUNCTION 函数名([参数1 类型, 参数2 类型, ...])
RETURNS 返回类型
DETERMINISTIC | NOT DETERMINISTIC
[READS SQL DATA | MODIFIES SQL DATA | ...]
BEGIN
    -- 函数体
    RETURN 值;
END;

关键点说明:

  • 函数名:你定义的函数名称,如 my_add、get_greeting
  • 参数:可选,可以有多个输入参数,如 a INT, b INT
  • RETURNS 类型:函数必须指定返回的数据类型,如 INT, VARCHAR(255), DECIMAL(10,2)等
  • DETERMINISTIC:表示​​相同的输入总是返回相同的输出​​,可优化性能(如纯计算函数)。如果不是确定的,用 NOT DETERMINISTIC
  • 函数体:用 BEGIN ... END包裹,里面写实现逻辑,必须用 RETURN返回一个值
  • 如果函数体有多条语句,需要设置 ​​分隔符​​(见下文)

三、示例 1:创建一个简单的加法函数

🎯 目标:创建一个函数,接收两个整数,返回它们的和

步骤:

1. 修改语句结束符(DELIMITER)

因为函数体有多条 SQL 语句(包括 BEGIN, RETURN, END),我们需要临时修改 MySQL 的语句结束符,避免与函数体中的分号冲突。

代码语言:javascript
代码运行次数:0
复制
DELIMITER //

2. 创建函数

代码语言:javascript
代码运行次数:0
复制
CREATE FUNCTION add_two_numbers(a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGIN
    RETURN a + b;
END //

3. 恢复默认分隔符

代码语言:javascript
代码运行次数:0
复制
DELIMITER ;

4. 调用函数

代码语言:javascript
代码运行次数:0
复制
SELECT add_two_numbers(10, 20);  -- 返回 30

四、示例 2:带字符串处理的函数

🎯 目标:创建一个函数,接收姓名,返回 "Hello, 姓名"

代码语言:javascript
代码运行次数:0
复制
DELIMITER //

CREATE FUNCTION greet(name VARCHAR(100))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    RETURN CONCAT('Hello, ', name);
END //

DELIMITER ;

调用:

代码语言:javascript
代码运行次数:0
复制
SELECT greet('Alice');  -- 返回 'Hello, Alice'

五、示例 3:带逻辑判断的函数

🎯 目标:根据分数返回等级

代码语言:javascript
代码运行次数:0
复制
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 ;

调用:

代码语言:javascript
代码运行次数:0
复制
SELECT get_grade(85);  -- 返回 'B'
SELECT get_grade(95);  -- 返回 'A'

六、查看已创建的函数

查看所有函数:

代码语言:javascript
代码运行次数:0
复制
SHOW FUNCTION STATUS;

查看函数的创建语句:

代码语言:javascript
代码运行次数:0
复制
SHOW CREATE FUNCTION 函数名;

例如:

代码语言:javascript
代码运行次数:0
复制
SHOW CREATE FUNCTION add_two_numbers;

七、删除函数

使用 DROP FUNCTION:

代码语言:javascript
代码运行次数:0
复制
DROP FUNCTION IF EXISTS 函数名;

例如:

代码语言:javascript
代码运行次数:0
复制
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权限,某些环境(如云数据库)可能限制此功能


页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券