在 MySQL 开发中,内置函数是提升 SQL 效率和灵活性的核心工具。无论是日期计算、字符串处理,还是数学运算、数据加密,合理使用内置函数能大幅简化代码,避免重复逻辑。本文基于实战场景,全面拆解 MySQL 常用内置函数,涵盖日期、字符串、数学、其他工具类函数,附带详细案例和避坑要点。
日期函数是业务开发中最常用的函数类别,用于获取当前时间、日期加减、时间差计算等场景,解决时间相关的数据处理问题。

函数 描述
current_date() 获取当前日期(格式:yyyy-mm-dd)
current_time() 获取当前时间(格式:hh:mm:ss)
current_timestamp() 获取当前时间戳(格式:yyyy-mm-dd hh:mm:ss)
now() 等同于
current_timestamp(),获取当前日期时间
date(datetime) 提取日期时间中的日期部分
date_add(date, interval 数值 单位) 日期/时间加法(单位:year/day/hour/minute/second)
date_sub(date, interval 数值 单位) 日期/时间减法(单位同上)
datediff(date1, date2) 计算 date1 - date2 的天数差(仅日期部分)
1.2.1 基础时间获取
-- 获取当前日期 select current_date(); -- 结果:2026-03-10 -- 获取当前时间 select current_time(); -- 结果:12:34:50 -- 获取当前时间戳 select current_timestamp(); -- 结果:2026-03-10 12:34:50 select now(); -- 结果同上,更常用
1.2.2 日期加减运算
-- 日期加10天 select date_add('2026-03-10', interval 10 day); -- 结果:2026-03-20 -- 日期减2年 select date_sub('2026-03-10', interval 2 year); -- 结果:2024-03-10 -- 时间加30分钟 select date_add('2026-03-10 14:30:00', interval 30 minute); -- 结果:2024-05-20 15:00:00 -- 时间减1小时 select date_sub('2026-03-10 14:30:00', interval 1 hour); -- 结果:2024-05-20 13:30:00
1.2.3 日期差计算与时间提取
-- 计算两个日期的天数差(date1 - date2) select datediff('2024-05-20', '2024-01-01'); -- 结果:140 -- 提取datetime中的日期部分 create table msg ( id int primary key auto_increment, content varchar(30) not null, sendtime datetime ); insert into msg(content, sendtime) values ('hello mysql', now()), ('hello function', now()); -- 仅显示发布日期,隐藏时间 select content, date(sendtime) as send_date from msg;
- 请查询在2分钟内发布的帖子
select * from msg where date_add(sendtime, interval 2 minute) > now();

1.2.4 业务场景:查询近期数据
-- 查询2分钟内发布的留言 select * from msg where date_add(sendtime, interval 2 minute) > now(); -- 查询3天内的生日记录 create table user_birthday ( id int primary key auto_increment, name varchar(20) not null, birthday date ); insert into user_birthday(name, birthday) values ('张三', '2000-05-18'), ('李四', '2000-06-01'), ('王五', '2000-05-22'); -- 计算当前日期与生日的差值,筛选3天内的记录 select * from user_birthday where datediff(birthday, current_date()) between 0 and 3;
字符串函数用于字符串的拼接、截取、替换、大小写转换等操作,解决文本格式处理、内容提取等需求。

以下是您提供的字符串函数表格:
函数名称 描述
charset(str) 返回字符串的字符集(如 utf8、gbk)
concat(str1, str2, ...) 拼接多个字符串
instr(str, substr) 返回 substr 在 str 中首次出现的位置(无则返回 0)
ucase(str) / upper(str) 字符串转大写
lcase(str) / lower(str) 字符串转小写
left(str, length) 从 str 左侧截取 length 个字符
length(str) 返回字符串长度(以字节为单位,受字符集影响)
replace(str, search_str, replace_str) 用 replace_str 替换 str 中的 search_str
substring(str, pos [, length]) 从 str 的 pos 位置(1 开始)截取 length 个字符(length 可选,默认到末尾)
ltrim(str) / rtrim(str) / trim(str) 去除字符串左侧 / 右侧 / 两侧的空格
strcmp(str1, str2) 逐字符比较 str1 和 str2(相等返回 0,str1 大返回 1,否则返回 -1)


2.2.1 字符串拼接与格式处理
-- 拼接字符串(业务场景:格式化显示成绩) create table exam_result ( name varchar(20) not null, chinese float, math float, english float ); insert into exam_result values ('张三', 85, 92, 78), ('李四', 90, 88, 95); -- 格式:“XXX的语文XXX分,数学XXX分,英语XXX分” select concat(name, '的语文', chinese, '分,数学', math, '分,英语', english, '分') as 成绩详情 from exam_result;
2.2.2 字符串截取与替换
-- 截取exam_result表中ename字段的第二个到第三个字符 select ename, substring(ename, 2, 2) from exam_result; -- 替换字符串(将ename列中有'S'的替换为'上海') select ename, replace(ename, 's', '上海') from exam_result; -- 左侧截取(取前3个字符) select left('hello world', 3); -- 结果:hel
2.2.3 大小写转换与空格处理
-- 转大写/小写 select ucase('mysql'), lower('MYSQL'); -- 结果:MYSQL、mysql -- 去除空格 select trim(' mysql '); -- 结果:mysql(去除两侧空格) select ltrim(' mysql '); -- 结果:mysql (仅去除左侧空格)
2.2.4 字符串长度与位置查询
-- 计算字符串长度(utf8编码下,中文占3字节) select length('mysql'), length('MySQL函数'); -- 结果:5、11(5+3*2=11) -- 查询子串位置(逗号在字符串中出现的位置) select instr('10,A,B', ','); -- 结果:3(第一个逗号的位置) -- 业务场景:统计逗号出现次数(OJ真题) select (length('10,A,B') - length(replace('10,A,B', ',', ''))) as cnt; -- 结果:2
2.2.5 首字母小写格式化
-- 员工姓名首字母小写,其余不变(如SMITH→sMITH) create table emp (ename varchar(20)); insert into emp values ('SMITH'), ('SCOTT'), ('WARD'); select concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) as format_name from emp;
数学函数用于数值的运算、进制转换、取整、随机数生成等,解决数值处理相关需求。

函数 描述
abs(number) 绝对值
bin(decimal) 十进制数转二进制
hex(decimal) 十进制数转十六进制
conv(number, from_base, to_base) 进制转换(如二进制转十进制)
ceiling(number) 向上取整(大于等于该数的最小整数)
floor(number) 向下取整(小于等于该数的最大整数)
format(number, decimals) 格式化数值,保留 decimals 位小数(四舍五入)
rand() 生成随机浮点数(范围:[0.0, 1.0))
mod(number, denominator) 取模(求余数,等同于 number % denominator)
-- 绝对值 select abs(-100.5), abs(200); -- 结果:100.5、200 -- 取整操作 select ceiling(23.1), ceiling(23.9); -- 结果:24、24(向上取整) select floor(23.1), floor(23.9); -- 结果:23、23(向下取整) -- 数值格式化(保留2位小数) select format(123.456, 2), format(78.9, 2); -- 结果:123.46、78.90 -- 进制转换 select bin(10), hex(10); -- 结果:1010(二进制)、A(十六进制) select conv('1010', 2, 10); -- 结果:10(二进制转十进制) -- 随机数生成(生成1-100的随机整数) select rand(), floor(rand() * 100) + 1; -- 取模运算(求余数) select mod(10, 3), 10 % 3; -- 结果:1、1


这类函数涵盖用户查询、数据库查询、数据加密、空值处理等实用功能,是开发中的 “小帮手”。
函数 描述
user() 查询当前登录 MySQL 的用户(格式:用户名@主机)
database() 查询当前正在使用的数据库
md5(str) 对字符串进行 MD5 加密(返回 32 位字符串)
password(str) MySQL 用户密码加密(仅用于用户认证,不推荐业务加密)
ifnull(val1, val2) 空值处理:val1 为 null 则返回 val2,否则返回 val1



– 查询当前用户和数据库 select user(); – 结果:root@localhost select database(); – 结果:当前使用的数据库名(如test) – 数据加密(业务场景:密码存储) select md5(‘admin’); – 结果:21232f297a57a5aa0e4a801fc3(MD5加密) select password(‘root’); – 结果:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B(MySQL密码加密) – 空值处理(避免null影响运算) create table user_info ( id int primary key auto_increment, name varchar(20) not null, age int ); insert into user_info(name, age) values (‘张三’, 20), (‘李四’, null), (‘王五’, 25); – 年龄为null时显示0 select name, ifnull(age, 0) as format_age from user_info;
- 日期函数的单位大小写不敏感:
interval 10 day和interval 10 DAY效果一致,但推荐小写; length函数按字节计算长度:utf8 编码下中文占 3 字节,gbk 编码下占 2 字节,需注意字符集影响substring函数的位置从 1 开始:不同于编程语言的 0 起始索引,如substring(‘mysql’, 1, 3)返回mys;rand ()函数每次调用生成新值:如需固定随机数,可结合种子(如rand(10)),但种子固定后随机序列固定;ifnull仅处理null值:空字符串(‘’)、0 等非 null 值不会触发替换,如需处理空字符串可结合case when;md5加密不可逆:仅用于密码存储等场景,不可用于需要解密的数据。
总结:MySQL 内置函数覆盖了日期、字符串、数学、工具类等核心场景,合理使用能大幅提升 SQL 开发效率。核心要点总结:
- 日期函数解决时间获取、加减、差值计算,是业务系统的核心工具;
- 字符串函数处理文本格式、拼接、截取,满足数据展示和清洗需求;
- 数学函数用于数值运算和格式化,适用于统计、随机数生成等场景;
- 工具类函数提供加密、空值处理等实用功能,简化开发流程。
到此这篇关于MySQL 内置函数指南之日期、字符串、数学函数实战的文章就介绍到这了,更多相关mysql内置函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/250070.html