MySQL中没有“方法”,只有函数(FUNCTION)和存储过程(PROCEDURE);函数必须返回值、用于SQL表达式且通常不可修改数据,存储过程无返回值、支持DML和事务;二者均不依附于对象或字段,调用方式为独立函数式而非面向对象的链式调用。
MySQL 里没有“方法”这个概念,只有函数(FUNCTION)和存储过程(PROCEDURE),所谓“方法式设计”是误用面向对象术语造成的混淆。
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_EXTRACT(json_col, '$.name') —— 看似“对 json_col 调用方法”,实则是把字段当参数传入纯函数MATCH(col) AGAINST('term') —— 语法特殊,但仍是函数调用,非列的方法cursor.execute("SELECT calc_tax(?)", amount))—— 应用层视角像“调方法”,DB 层仍是标准函数column.func() 写法 —— 这是 ORM 的 DSL 抽象,最终仍翻译成 FUNC(column) 形式发给 MySQL决定用 FUNCTION 还是 PROCEDURE,关键看使用场景:
WHERE、ORDER BY、计算列中直接参与 SQL 运算 → 必须用 FUNCTION(PROCEDURE 不允许出现在表达式中)PROCEDURE
PROCEDURE(除非 MySQL 8.0+ 开启 log_bin_trust_function_creators 并显式声明)SELECT
比如写一个校验邮箱格式的函数,适合用 FUNCTION;但批量清洗用户

PROCEDURE。
真正容易被忽略的是函数的确定性(DETERMINISTIC)声明——如果漏标却返回非确定结果(如依赖 NOW() 或子查询),在复制环境或查询优化时可能出错。