sql中函数调用的基本语法_mysql函数写法说明

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

MySQL 中函数调用的通用语法结构

MySQL 里调用内置函数或自定义函数,统一用

函数名(参数1, 参数2, ...)
形式,括号不可省略,哪怕无参函数也必须写
()
。函数名不区分大小写(受 SQL mode 和操作系统影响),但建议保持小写以避免跨平台问题。

常见错误是把函数当字段别名写,比如

SELECT NOW as time
—— 这实际查的是名为
NOW
的列,不是调用函数;正确写法是
SELECT NOW() as time

所有参数按位置传入,不支持命名参数 字符串常量必须用单引号
' '
,双引号在标准模式下不被识别为字符串
NULL 可直接作为参数传入,多数函数会返回 NULL(如
CONCAT('a', NULL)
NULL
嵌套调用合法:
DATE_FORMAT(NOW(), '%Y-%m')

常见内置函数调用示例与易错点

不同函数对参数类型和数量敏感,稍有不慎就报错或返回意外结果。比如

SUBSTRING()
在 MySQL 8.0+ 支持三参数形式
SUBSTRING(str, pos, len)
,但旧版本只认两参数
SUBSTRING(str, pos)
;而
LEFT()
RIGHT()
则始终只要两个参数。

另一个典型陷阱是时间函数:用

NOW()
获取当前时间,但若在存储过程中多次调用,它每次返回的值可能相同(因为语句级时间戳);需要毫秒级变化应改用
SYSDATE()

SELECT 
  SUBSTRING('hello world', 1, 5) AS part,
  LEFT('hello world', 5) AS left_part,
  DATE_ADD('2023-01-01', INTERVAL 1 DAY) AS next_day;

自定义函数(UDF)调用注意事项

用户创建的函数必须先用

CREATE FUNCTION
定义,并且调用者需有
EXECUTE
权限。函数名不能与内置函数同名,否则调用时优先匹配内置函数,自定义函数会被忽略。

自定义函数不能包含非确定性操作(如

INSERT
UPDATE
、调用
RAND()
等),否则创建会失败或执行时报错
ERROR 1418
。若确需,必须显式声明
DETERMINISTIC
NO SQL
等特性。

函数体中不能使用临时表(
CREATE TEMPORARY TABLE
返回类型必须与
RETURNS
声明严格一致,比如声明
RETURNS INT
,就不能在函数体内返回字符串
调用时仍遵循
func_name(arg1, arg2)
,不加 schema 前缀(除非跨库调用且函数属于其他数据库)

函数调用在 WHERE / ORDER BY / GROUP BY 中的行为

函数可出现在几乎所有表达式上下文中,但在

WHERE
子句中滥用会导致索引失效。例如
WHERE YEAR(create_time) = 2023
无法走
create_time
上的索引;应改写为
WHERE create_time >= '2023-01-01' AND create_time 。

ORDER BY
中使用函数(如
ORDER BY UPPER(name)
)会强制排序前计算全部结果,影响性能;若频繁使用,建议建函数索引(MySQL 8.0+ 支持):
CREATE INDEX idx_upper_name ON t1 ((UPPER(name)))

GROUP BY
中允许函数,但要注意 MySQL 5.7 严格模式下,
SELECT
列表中未出现在
GROUP BY
的非聚合字段会报错 —— 函数结果也被视为“非分组字段”,需显式包裹进聚合函数或加入
GROUP BY

函数调用看着简单,真正麻烦的是隐式类型转换、SQL mode 对函数行为的影响(比如
STRICT_TRANS_TABLES
下日期函数更严格),还有跨版本兼容性——有些函数 5.6 没有,8.0 才加,上线前最好在目标环境验证一遍。

相关推荐