4人参与 • 2026-09-21 • Mysql
mysql函数是数据库内置的操作指令集,可以直接在sql语句中调用,用于执行数据处理、转换、计算及流程控制等任务。
简单说,函数就像一个“黑盒”:你把参数丢进去,它经过内部运算后返回一个结果。函数必须有返回值,而且不会修改原始数据,只对查询结果进行加工。
很多人容易把mysql函数和上一篇博客讲的存储过程弄混,两者虽然都是数据库中封装好的程序块,但在定义、调用方式、返回值上有很大区别。简单一句话:mysql函数,是一段封装好、必须有返回值的sql逻辑,像编程语言里的普通函数,传入参数,返回单个结果。
重点区分:函数一定有返回值;存储过程可以没有返回值,用out输出参数。函数可以直接写在
select里;存储过程只能用call调用。
mysql函数分为两大类:内置函数和自定义函数(udf,user defined function)
concat()字符串拼接、date_format()日期格式化、sum()、count()聚合函数。自定义函数基础语法结构:
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调用存储过程、不能使用事务、不能返回结果集,只能返回单个标量值。
-- 拼接字符串
select concat('姓名:',username) from user;
-- 截取子串
select substring(username,1,3) from user;
-- 字符串长度
select length(username) from user;-- 格式化日期 select date_format(create_time,'%y-%m-%d') from user; -- 获取当前日期 select curdate(); -- 日期加减 select date_add(curdate(),interval 7 day);
select round(3.1415,2); -- 四舍五入 select ceil(2.1); -- 向上取整 select floor(2.9); -- 向下取整
sum() 求和 avg() 平均值 max() 最大值 min() 最小值 count() 计数
-- if判断 select if(score>=60,'及格','不及格'); -- case when select case when score>=90 then '优秀' else '普通' end;
✅ 适合场景
-- 简单脱敏示例
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');❌ 不适合场景
| 对比项 | 自定义函数 | 存储过程 |
|---|---|---|
| 返回值 | 必须有且只能返回单个标量值 | 无强制返回,可使用out输出多个结果 |
| 调用方式 | select func_name(参数) | call proc_name(参数) |
| 使用位置 | 可写在select、where中 | 不能嵌入select |
| 事务 | 不支持事务 | 支持事务 |
| 返回结果集 | 不能返回多行结果集 | 可以select返回结果集 |
| 限制 | 限制较多 | 更灵活 |
where条件字段上,会造成无法走索引,大数据表慎用;deterministic标记:相同入参一定返回相同结果,很多数据库模式下必须加上;mysql函数就是用来做计算、转换的工具。内置函数日常开发天天在用;自定义函数适合封装简单、无副作用、需要多处复用的标量计算逻辑。
记住核心区别:函数重在计算返回一个值;存储过程重在执行一系列操作。
实际开发,优先内置函数;复杂业务逻辑放到应用代码,自定义函数和存储过程都不要滥用。
补充:
mysql函数主要分两大类:
concat() 把姓氏和名字合成全名,生成完整地址或报表展示列。substring() + concat() 把手机号中间四位打码(如 139‌****‌5678),或姓名只显示首尾字符。trim() 去掉多余空格、replace() 替换异常字符、upper()/lower() 统一大小写。round() 做四舍五入(财务规范)、ceil()/floor() 向上/向下取整。ceiling(count(*)/10) 算总页数。rand() 生成随机数。date_format() 按年/月/周分组汇总数据,比如统计每月订单量。datediff() 计算员工入职天数、合同剩余天数等。date_sub() 查最近7天或本月的记录。case when 把分数转为等级(a/b/c/d),或把状态码翻译成可读文本。ifnull() 把 null 替换为默认值(如 0 或空字符串),避免数值计算结果为 null。group_concat() 把多行数据拼成一行,比如列出每个订单的所有商品名称。count()、sum()、avg() 统计总数、总额和平均值。sha2() 加盐存储密码、aes_encrypt() 加密敏感字段。concat() 拼接表名和条件,配合 prepare/execute 构建动态查询语句,适用于分表查询等场景。不要在索引列外层包裹函数,比如
where year(create_time) = 2026会导致索引失效,应改用区间写法create_time >= '2026-01-01'。
自定义函数适合复用复杂业务公式(如绩效计算),但简单逻辑尽量优先用内置函数,性能和稳定性更好。
到此这篇关于mysql中的函数是什么,有什么作用及应用场景分析的文章就介绍到这了,更多相关mysql函数应用场景内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论