游乐游手机版
首页/数据库/文章详情

MySQL存储函数使用方法与语法详解

时间:2026-08-17 19:00
一、存储函数 vs 存储过程 对比项 存储函数 (FUNCTION) 存储过程 (PROCEDURE) 返回值 必须通过 `RETURN` 语句返回单个结果值 可通过 `OUT` `INOUT` 参数返回零个或多个结果,但本身没有直接返回值 主要用途 用于计算并返回一个结果,适合封装查询或表达式逻

一、存储函数 vs. 存储过程

MySQL存储函数

对比项 存储函数 (FUNCTION) 存储过程 (PROCEDURE)

返回值 必须通过 `RETURN` 语句返回单个结果值 可通过 `OUT`/`INOUT` 参数返回零个或多个结果,但本身没有直接返回值

主要用途 用于计算并返回一个结果,适合封装查询或表达式逻辑 用于执行较复杂的业务逻辑操作,例如增删改、流程控制、事务处理等

调用方式 可在 SQL 语句中直接调用(如 `SELECT`) 通过 `CALL` 语句进行调用

参数类型 参数默认为 `IN`(输入参数),不支持 `OUT`/`INOUT` 参数 参数可以是 `IN`、`OUT`、`INOUT`

二、创建存储函数 (CREATE FUNCTION)

基本语法:

CREATE FUNCTION function_name ([parameter_list])
RETURNS data_type
[characteristic ...]
routine_body


`function_name`: 存储函数名称。名称应保持唯一,实际开发中通常推荐使用 `func_` 前缀,便于管理与识别。

`parameter_list`: 参数列表。标准格式为:`[IN] param_name param_type`。由于存储函数参数只能是输入参数,因此 `IN` 关键字一般可以省略。

`param_name`: 参数名称。

`param_type`: 参数的数据类型,例如 `INT`、`VARCHAR(255)` 等。

`RETURNS data_type`: 必须明确声明函数返回值的数据类型,这是 MySQL 创建存储函数时的必要部分。

`characteristic`: 函数特性配置(可选),与存储过程中的特性定义类似。常见选项包括:

`DETERMINISTIC`:表示该函数是“确定性”的,也就是在相同输入条件下始终返回相同输出,例如常见数学计算函数。如果函数中使用了 `NOW()` 等非确定性函数,则不应声明为此选项。

`NOT DETERMINISTIC`:表示该函数是“非确定性”的,这也是默认设置。

`COMMENT 'string'`:用于添加函数注释说明,便于后续维护和查看。

`routine_body`: 函数体,由 `BEGIN ... END` 包裹的有效 SQL 语句组成,并且必须至少包含一个 `RETURN value` 语句来返回结果。

三、创建示例与步骤

在 MySQL 中创建存储函数时,通常需要临时修改语句分隔符,避免函数体内的 `;` 被错误识别为整个 SQL 语句结束符。

1. 选择数据库:

USE test;

2. 修改分隔符 (通常改为 `//` 或 `$$`):

DELIMITER //

3. 创建函数:

CREATE FUNCTION func_student(std_id INT)

RETURNS VARCHAR(20)

COMMENT '根据学生ID查询姓名'

BEGIN

声明一个变量用于保存查询结果

DECLARE student_name VARCHAR(20);

查询学生姓名并赋值给变量

SELECT name INTO student_name

FROM tb_student

WHERE id = std_id;

返回最终结果

RETURN(student_name);

END //

4. 恢复分隔符:

DELIMITER ;

示例 2:计算两个整数之和(更直观的入门示例)

DELIMITER //
CREATE FUNCTION func_add(a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGIN
    RETURN a + b;
END //
DELIMITER ;

四、调用存储函数

MySQL 存储函数可以在所有允许使用表达式的场景中调用,其中最常见的用法是在 `SELECT` 查询语句中直接使用:

调用示例1中的函数

SELECT func_student(1);

调用示例2中的函数

SELECT func_add(5, 3); -- 返回 8

在实际查询中使用函数

SELECT id, name, func_add(score, 10) AS new_score FROM tb_student;

五、管理存储函数

1. 查看函数

查看所有函数状态(支持模糊匹配):

SHOW FUNCTION STATUS LIKE 'func_%';

查看指定函数的定义:

SHOW CREATE FUNCTION func_student;

从 information_schema 信息模式中查询:

SELECT * FROM information_schema.ROUTINES

WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_NAME = 'func_student';

2. 修改函数

`ALTER FUNCTION` 语句主要用于修改注释、特性等元数据信息,不能直接修改函数体或参数定义。如果需要调整函数逻辑或参数,通常必须先 `DROP`,再重新 `CREATE`。

ALTER FUNCTION func_student COMMENT 'This is a new comment';

3. 删除函数

DROP FUNCTION IF EXISTS func_student;

`IF EXISTS` 属于可选写法,可避免在函数不存在时直接报错。

六、重要注意事项

1. 权限:创建 MySQL 存储函数通常需要具备 `CREATE ROUTINE` 权限。

2. 确定性:如果函数被声明为 `DETERMINISTIC`,但实际并非确定性函数,可能导致优化器做出错误判断,从而影响执行结果或查询计划。

3. RETURN 类型:`RETURN` 语句返回的值必须与 `RETURNS` 子句中声明的数据类型兼容,否则 MySQL 可能会进行隐式强制转换。

4. 需要特别注意,存储函数的函数体存在一定限制。它不能使用会触发显式或隐式提交(`COMMIT`)或回滚(`ROLLBACK`)的 SQL 语句。并且在一般情况下,也不允许直接修改数据库数据,例如 `INSERT`、`UPDATE`、`DELETE` 等语句通常都不能在存储函数中使用。因此,存储函数更适合用于结果计算、数据转换和查询封装,这一点与存储过程有明显区别。

来源:https://www.dotcpp.com/course/1595
上一篇从实例入门:教你创建并执行事件的方法 下一篇MySQL触发器修改删除方法与操作指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis是什么:核心特性、架构与应用场景解析
数据库 · 2026-09-01

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

Windows 安装 MongoDB 完整图文教程
数据库 · 2026-09-01

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
数据库 · 2026-09-01

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

MacOS安装MongoDB完整教程
数据库 · 2026-09-01

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

Ubuntu系统安装与配置Redis完整指南
数据库 · 2026-09-01

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。