mysql函数和方法有什么区别_mysql中方法式设计说明

来源:这里教程网 时间:2026-02-28 20:40:09 作者:

MySQL 里没有“方法”这个概念,只有函数(

FUNCTION
)和存储过程(
PROCEDURE
),所谓“方法式设计”是误用面向对象术语造成的混淆。

MySQL 中根本没有
method
关键字或语法

Java、Python 等语言中

method
指绑定在类/对象上的函数,而 MySQL 是关系型数据库,不支持类、实例、this 指针等 OOP 特性。所有可调用的逻辑封装单元只有两类:

FUNCTION
:必须有返回值,只能用在 SQL 表达式中(如
SELECT my_func(id)
),不能修改数据(除非显式声明
READS SQL DATA
或更宽松权限)
PROCEDURE
:无返回值,但可通过
OUT
/
INOUT
参数传回结果,支持 DML(
INSERT
/
UPDATE
/
DELETE
)和事务控制

FUNCTION
的调用方式像“表达式”,不是“方法调用”

你不能写

table.column.func()
obj.doSomething()
这类链式调用——MySQL 不支持对象方法语法。所有函数都是独立命名空间下的全局标识符:

SELECT CONCAT('Hello', ' ', UPPER('world')) AS greeting;
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);

注意:

UPPER()
DATE_ADD()
都是标量函数,直接传参调用;它们不依附于任何表字段或变量,也不改变调用上下文状态。

为什么有人误称“方法”?常见混淆点

这些场景容易让人联想到“方法”,但本质仍是函数或过程:

JSON 函数如
JSON_EXTRACT(json_col, '$.name')
—— 看似“对 json_col 调用方法”,实则是把字段当参数传入纯函数
全文检索函数
MATCH(col) AGAINST('term')
—— 语法特殊,但仍是函数调用,非列的方法
自定义函数被业务代码反复调用(如 Python 里
cursor.execute("SELECT calc_tax(?)", amount)
)—— 应用层视角像“调方法”,DB 层仍是标准函数
某些 ORM(如 SQLAlchemy)生成的 SQL 里出现
column.func()
写法 —— 这是 ORM 的 DSL 抽象,最终仍翻译成
FUNC(column)
形式发给 MySQL

真正该关注的是函数 vs 存储过程的选型边界

决定用

FUNCTION
还是
PROCEDURE
,关键看使用场景:

需要在
WHERE
ORDER BY
、计算列中直接参与 SQL 运算 → 必须用
FUNCTION
PROCEDURE
不允许出现在表达式中)
要执行多条 DML、带事务、返回多个结果集或动态 SQL → 只能用
PROCEDURE
函数体内禁止调用
PROCEDURE
(除非 MySQL 8.0+ 开启
log_bin_trust_function_creators
并显式声明)
函数性能更敏感:若含复杂逻辑或子查询,可能在每行上重复执行,拖慢整个
SELECT

比如写一个校验邮箱格式的函数,适合用

FUNCTION
;但批量清洗用户表并记录日志,就得用
PROCEDURE

真正容易被忽略的是函数的确定性(

DETERMINISTIC
)声明——如果漏标却返回非确定结果(如依赖
NOW()
或子查询),在复制环境或查询优化时可能出错。

相关推荐