一文彻底吃透MySQL内置函数日期、字符串、数学函数(实战案例)
前言
在 MySQL 项目开发过程中,内置函数是优化 SQL 编写、增强查询灵活性的重要手段。不管是日期运算、文本处理,还是数值计算、数据脱敏加密,合理运用内置函数能够有效精简业务代码,消除重复逻辑。本文结合真实开发场景,系统梳理 MySQL 高频内置函数,分为日期函数、字符串函数、数学函数与通用工具函数四大模块,搭配可直接运行的实操示例,同时梳理开发中常见误区与优化建议。
一、日期时间函数:应对业务中的各类时间逻辑
日期函数是业务开发中最常用的函数类别,用于获取当前时间、日期加减、时间差计算等场景,解决时间相关的数据处理问题。
1.1 时间类核心函数速查表
| 函数 | 描述 |
|---|---|
| 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.2.1 系统时间的获取方式
-- 获取当前日期 select current_date(); +----------------+ | current_date() | +----------------+ | 2017-11-19 | +----------------+ -- 获取当前时间 select current_time(); +----------------+ | current_time() | +----------------+ | 13:51:21 | +----------------+ -- 获取当前时间戳 select current_timestamp(); +---------------------+ | current_timestamp() | +---------------------+ | 2017-11-19 13:51:48 | +---------------------+ select now(); -- 结果同上,更常用
1.2.2 日期的向前、向后偏移计算
-- 日期加10天
select date_add('2026-03-10', interval 10 day); -- 结果:2026-03-20
+-----------------------------------------+
| date_add('2026-03-10', interval 10 day) |
+-----------------------------------------+
| 2026-03-20 |
+-----------------------------------------+
-- 日期减2年
select date_sub('2026-03-10', interval 2 year); -- 结果:2024-03-10
+-----------------------------------------+
| date_add('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
+-----------------------------------------------------+
| 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
+--------------------------------------------------+
| date_add('2026-03-10 14:30:00', interval 1 hour) |
+--------------------------------------------------+
|2024-05-20 13:30:00 |
+--------------------------------------------------+1.2.3 时间差运算与时间单元提取
-- 计算两个日期的天数差(date1 - date2)
select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
| 404 |
+------------------------------------+
-- 提取datetime中的日期部分
-- 创建用户表
create table user_info (
id int primary key auto_increment,
username varchar(30) not null,
birthday datetime
);
insert into user_info(username, birthday) values
('zhangsan', now()),
('lisi', now()),
('wangwu', now());
-- 仅显示发布日期,隐藏时间
select username, date(birthday) as birth_date from user_info;
+----------+------------+
| username | birth_date |
+----------+------------+
| zhangsan | 2026-08-11 |
| lisi | 2026-08-11 |
| wangwu | 2026-08-11 |
+----------+------------+1.2.4 业务实例:筛选指定周期内的数据
--创建一个留言表
mysql> create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);
--插入数据
mysql> insert into msg(content,sendtime) values('hello1', now());
mysql> insert into msg(content,sendtime) values('hello2', now());
mysql> select * from msg;
+----+---------+---------------------+
| id | content | sendtime |
+----+---------+---------------------+
| 1 | hello1 | 2017-11-19 14:12:20 |
| 2 | hello2 | 2017-11-19 14:13:21 |
+----+---------+---------------------+
--显示所有留言信息,发布日期只显示日期,不用显示时间
select content,date(sendtime) from msg;
--请查询在2分钟内发布的帖子
select * from msg where date_add(sendtime, interval 2 minute) > now();
理解:----------------|-----------|-------------|------------------
初始时间 now() 初始时间+2min
(两分钟以内)二、字符串处理函数:完成文本的加工转换
字符串函数用于字符串的拼接、截取、替换、大小写转换等操作,解决文本格式处理、内容提取等需求。
2.1 高频字符串函数一览
| 函数名称 | 描述 |
|---|---|
| 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 业务场景实操演示
2.2.1 获取字符集
--获取emp表的ename列的字符集 select charset(ename) from EMP;

2.2.2 字符串拼接与格式处理
-- 拼接字符串(业务场景:格式化显示成绩)
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.3 字符串截取与内容替换
-- 截取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.4 大小写切换与多余空格清理
-- 转大写/小写
select ucase('mysql'), lower('MYSQL'); -- 结果:MYSQL、mysql
-- 去除空格
select trim(' mysql '); -- 结果:mysql(去除两侧空格)
select ltrim(' mysql '); -- 结果:mysql (仅去除左侧空格)
2.2.5 统计文本长度、定位字符位置
-- 计算字符串长度(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.6 首字母格式调整处理
-- 员工姓名首字母小写,其余不变(如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;

三、数学运算函数:完成数据库层数值运算
数学函数用于数值的运算、进制转换、取整、随机数生成等,解决数值处理相关需求。
3.1 常用数学函数参考表
| 函数 | 描述 |
|---|---|
| abs(number) | 绝对值 |
| bin(decimal) | 十进制数转二进制 |
| hex(decimal) | 十进制数转十六进制 |
| conv(number, from_base, to_base) | 进制转换:from_base进制转to_base进制(如二进制转八进制) |
| ceiling(number) | 向上取整(大于等于该数的最小整数) |
| floor(number) | 向下取整(小于等于该数的最大整数) |
| format(number, decimals) | 格式化数值,保留 decimals 位小数(四舍五入) |
| rand() | 生成随机浮点数(范围:[0.0, 1.0)) |
| mod(number, denominator) | 取模(求余数,等同于 number % denominator) |
3.2 实战案例
-- 绝对值
select abs(-100.5), abs(200); -- 结果:100.5、200
+------------+-----------+
| abs(-100.5)| abs(200) |
+------------+-----------+
| 100.5 | 200 |
+------------+-----------+
-- 取整操作
select ceiling(23.1), ceiling(23.9); -- 结果:24、24(向上取整)
+----------------+----------------+
| ceiling(23.1) | ceiling(23.9) |
+----------------+----------------+
| 24 | 24 |
+----------------+----------------+
select floor(23.1), floor(23.9); -- 结果:23、23(向下取整)
+-------------+-------------+
| floor(23.1) | floor(23.9) |
+-------------+-------------+
| 23 | 23 |
+-------------+-------------+
-- 数值格式化(保留2位小数)
select format(123.456, 2), format(78.9, 2); -- 结果:123.46、78.90
+---------------------+------------------+
| format(123.456, 2) | format(78.9, 2) |
+---------------------+------------------+
| 123.46 | 78.90 |
+---------------------+------------------+
-- 进制转换
select bin(10), hex(10); -- 结果:1010(二进制)、A(十六进制)
+---------+---------+
| bin(10) | hex(10) |
+---------+---------+
| 1010 | A |
+---------+---------+
select conv('1010', 2, 10); -- 结果:10(二进制转十进制)
+---------------------+
| conv('1010', 2, 10) |
+---------------------+
| 10 |
+---------------------+
-- 随机数生成(生成1-100的随机整数)
select rand(), floor(rand() * 100) + 1;
+------------------+-------------------------+
| rand() | floor(rand() * 100) + 1 |
+------------------+-------------------------+
| 0.367241568942 | 37 |
+------------------+-------------------------+
-- 取模运算(求余数)
select mod(10, 3), 10 % 3; -- 结果:1、1
+------------+--------+
| mod(10, 3) | 10 % 3 |
+------------+--------+
| 1 | 1 |
+------------+--------+
四、通用工具函数:开发辅助类实用能力
这类函数涵盖用户查询、数据库查询、数据加密、空值处理等实用功能,是开发中的 “小帮手”。
4.1 工具类核心函数汇总
| 函数 | 描述 |
|---|---|
| user() | 查询当前登录 MySQL 的用户(格式:用户名 @主机) |
| database() | 查询当前正在使用的数据库 |
| md5(str) | 对字符串进行 MD5 加密(返回 32 位字符串) |
| password(str) | MySQL 用户密码加密(仅用于用户认证,不推荐业务加密) |
| ifnull(val1, val2) | 空值处理:val1 为 null 则返回 val2,否则返回 val1 |
4.2 业务场景实操演示
-- 查询当前用户和数据库
select user(); -- 结果:root@localhost
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
select database(); -- 结果:当前使用的数据库名(如test)
+------------+
| database() |
+------------+
| test |
+------------+
-- 数据加密(业务场景:密码存储)
select md5('admin'); -- 结果:21232f297a57a5a743894a0e4a801fc3(MD5加密)
+----------------------------------+
| md5('admin') |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
select password('root'); -- 结果:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B(MySQL密码加密)
+-------------------------------------------+
| password('root') |
+-------------------------------------------+
| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------------------------------------------+
-- 空值处理(避免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;
+------+------------+
| name | format_age |
+------+------------+
| 张三 | 20 |
| 李四 | 0 |
| 王五 | 25 |
+------+------------+五、函数使用避坑与总结
- 日期函数的单位大小写不敏感: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 各类内置函数,覆盖时间日期、字符串、数值运算以及通用工具函数,同时结合多组业务示例演示了函数在真实开发中的使用方式。
内置函数能够极大简化 SQL 编写,把原本需要在业务代码完成的计算逻辑放到数据库层处理,但也要意识到函数并非使用越多越好。在索引字段上滥用函数,很容易造成索引失效,引发查询性能下降,这也是实际开发中高频踩坑点。
熟练掌握各类函数的能力与边界,合理取舍,才能写出兼顾简洁与性能的 SQL 语句。后续我们将继续学习多表查询、表连接等进阶查询语法。
到此这篇关于MySQL内置函数日期、字符串、数学函数的文章就介绍到这了,更多相关MySQL内置函数日期、字符串、数学函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
insert...on duplicate key update语法详解
本文主要介绍了insert...on duplicate key update语法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-01-01


最新评论