mysql函数是数据库内置的操作指令集,可以直接在sql语句中调用,用于执行数据处理、转换、计算及流程控制等任务。
简单说,函数就像一个“黑盒”:你把参数丢进去,它经过内部运算后返回一个结果。函数必须有返回值,而且不会修改原始数据,只对查询结果进行加工。
前言
很多人容易把mysql函数和上一篇博客讲的存储过程弄混,两者虽然都是数据库中封装好的程序块,但在定义、调用方式、返回值上有很大区别。简单一句话:mysql函数,是一段封装好、必须有返回值的sql逻辑,像编程语言里的普通函数,传入参数,返回单个结果。
重点区分:函数一定有返回值;存储过程可以没有返回值,用out输出参数。函数可以直接写在
select里;存储过程只能用call调用。
一、mysql函数是什么
mysql函数分为两大类:内置函数和自定义函数(udf,user defined function)
- 内置函数:mysql原生自带,开箱即用。比如
concat()字符串拼接、date_format()日期格式化、sum()、count()聚合函数。 - 自定义函数:自己用sql编写,保存到数据库,一次定义,反复调用,需要指定返回值类型。
自定义函数基础语法结构:
drop function if exists func_get_score_level;
delimiter $$
create function func_get_score_level(p_score int)
returns varchar(20) -- 定义返回值类型,必不可少
deterministic -- 相同输入,固定返回相同结果
begin
declare res varchar(20);
if p_score >= 90 then
set res = '优秀';
elseif p_score >= 60 then
set res = '及格';
else
set res = '不及格';
end if;
return res; -- 必须return返回结果
end $$
delimiter ;调用自定义函数,直接放在select中:
select func_get_score_level(78) as level;
注意:自定义函数有不少限制,不能使用
call调用存储过程、不能使用事务、不能返回结果集,只能返回单个标量值。
二、函数的核心作用
- 逻辑复用:一段计算规则多处sql都要用,不用重复写一堆if/case,调用函数即可,统一规则。
- 简化sql语句:把复杂计算、格式转换封装,让select语句更清爽,可读性更高。
- 统一计算口径:报表、统计查询共用同一套计算逻辑,避免不同开发人员写出来的规则不一致。
- 隐藏复杂细节:上层业务只关心输入参数和最终结果,不用关心内部实现。
三、常见内置函数分类+示例
1. 字符串函数
-- 拼接字符串
select concat('姓名:',username) from user;
-- 截取子串
select substring(username,1,3) from user;
-- 字符串长度
select length(username) from user;2. 日期函数
-- 格式化日期 select date_format(create_time,'%y-%m-%d') from user; -- 获取当前日期 select curdate(); -- 日期加减 select date_add(curdate(),interval 7 day);
3. 数值函数
select round(3.1415,2); -- 四舍五入 select ceil(2.1); -- 向上取整 select floor(2.9); -- 向下取整
4. 聚合函数(分组统计,搭配group by)
sum() 求和 avg() 平均值 max() 最大值 min() 最小值 count() 计数
5. 流程控制函数
-- if判断 select if(score>=60,'及格','不及格'); -- case when select case when score>=90 then '优秀' else '普通' end;
四、自定义函数的适用场景
✅ 适合场景
- 简单字段计算:比如根据订单金额、折扣,封装一个计算实付金额的函数;根据分数自动换算等级。
- 统一数据格式化:脱敏处理,手机号中间4位打码、身份证部分隐藏。
-- 简单脱敏示例
drop function if exists func_mask_phone;
delimiter $$
create function func_mask_phone(phone varchar(11))
returns varchar(11)
deterministic
begin
return concat(substring(phone,1,3),'****',substring(phone,8));
end $$
delimiter ;
select func_mask_phone('13812345678');- 报表维度统一转换:如根据时间戳自动返回季度、财年;根据编码转换名称。
- 多表查询中复用简单计算规则,直接嵌入select、where条件。
❌ 不适合场景
- 逻辑复杂、包含大量循环、多表查询;
- 需要返回多行、多列结果(这种要用存储过程);
- 涉及事务、回滚操作,函数不支持;
- 大数据量查询,函数作用在字段上会导致索引失效,严重影响性能。
五、函数 vs 存储过程(快速对比)
| 对比项 | 自定义函数 | 存储过程 |
|---|---|---|
| 返回值 | 必须有且只能返回单个标量值 | 无强制返回,可使用out输出多个结果 |
| 调用方式 | select func_name(参数) | call proc_name(参数) |
| 使用位置 | 可写在select、where中 | 不能嵌入select |
| 事务 | 不支持事务 | 支持事务 |
| 返回结果集 | 不能返回多行结果集 | 可以select返回结果集 |
| 限制 | 限制较多 | 更灵活 |
六、注意事项
- 自定义函数如果写在
where条件字段上,会造成无法走索引,大数据表慎用; deterministic标记:相同入参一定返回相同结果,很多数据库模式下必须加上;- 内置函数优先使用,尽量少写自定义函数,自定义函数会增加数据库维护成本;
- 不要在函数内部做太重的计算,会拖慢查询速度。
小结
mysql函数就是用来做计算、转换的工具。内置函数日常开发天天在用;自定义函数适合封装简单、无副作用、需要多处复用的标量计算逻辑。
记住核心区别:函数重在计算返回一个值;存储过程重在执行一系列操作。
实际开发,优先内置函数;复杂业务逻辑放到应用代码,自定义函数和存储过程都不要滥用。
补充:
🧩 函数分类
mysql函数主要分两大类:
- 内置函数:系统自带的,直接调用即可,覆盖字符串、数学、日期、流程控制等场景。
- 自定义函数(udf):开发者根据业务需求自行编写,用于复用复杂逻辑。
🛠️ 主要作用
- 简化复杂操作:把原本需要几十行代码的业务逻辑,用一条sql就能搞定。
- 提升查询效率:让数据库替你完成计算工作,避免把数据捞到应用层(如java/python)再处理,性能更高。
- 增强sql灵活性:支持在查询、插入、更新等语句中直接进行数据处理和转换。
- 保证数据一致性:比如统一大小写、格式化日期等操作在数据库层完成,避免各应用层实现不一致。
📋 常见应用场景
1. 字符串处理
- 数据拼接:用
concat()把姓氏和名字合成全名,生成完整地址或报表展示列。 - 数据脱敏:用
substring()+concat()把手机号中间四位打码(如139‌****‌5678),或姓名只显示首尾字符。 - 数据清洗:用
trim()去掉多余空格、replace()替换异常字符、upper()/lower()统一大小写。
2. 数值计算
- 金额处理:用
round()做四舍五入(财务规范)、ceil()/floor()向上/向下取整。 - 分页计算:用
ceiling(count(*)/10)算总页数。 - 随机抽样:用
rand()生成随机数。
3. 日期时间处理
- 报表统计:用
date_format()按年/月/周分组汇总数据,比如统计每月订单量。 - 有效期判断:用
datediff()计算员工入职天数、合同剩余天数等。 - 时间筛选:用
date_sub()查最近7天或本月的记录。
4. 流程控制
- 条件逻辑:用
case when把分数转为等级(a/b/c/d),或把状态码翻译成可读文本。 - 空值兜底:用
ifnull()把 null 替换为默认值(如 0 或空字符串),避免数值计算结果为 null。
5. 数据聚合
- 行转列:用
group_concat()把多行数据拼成一行,比如列出每个订单的所有商品名称。 - 汇总统计:用
count()、sum()、avg()统计总数、总额和平均值。
6. 数据安全
- 加密存储:用
sha2()加盐存储密码、aes_encrypt()加密敏感字段。
7. 动态sql生成
- 用
concat()拼接表名和条件,配合prepare/execute构建动态查询语句,适用于分表查询等场景。
⚠️ 注意事项
不要在索引列外层包裹函数,比如
where year(create_time) = 2026会导致索引失效,应改用区间写法create_time >= '2026-01-01'。
自定义函数适合复用复杂业务公式(如绩效计算),但简单逻辑尽量优先用内置函数,性能和稳定性更好。
到此这篇关于mysql中的函数是什么,有什么作用及应用场景分析的文章就介绍到这了,更多相关mysql函数应用场景内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论