文章目录
- MySQL内置函数入门指南|零基础也能看懂的日期/字符串/数学函数大全
-
- 一、日期时间函数:你的专属时间管理大师
- 二、字符串函数:文本处理的美颜工具箱
-
- 核心函数速查表
- [重点避坑 & 常用演示](#重点避坑 & 常用演示)
-
- [1. length():别把"字节"当"字符"](#1. length():别把“字节”当“字符”)
- [2. concat():把多列拼成一句话](#2. concat():把多列拼成一句话)
- [3. replace():批量替换内容](#3. replace():批量替换内容)
- [4. substring():截取指定位置字符](#4. substring():截取指定位置字符)
- [5. 进阶小技巧:首字母小写](#5. 进阶小技巧:首字母小写)
- 三、数学函数:数据库里的自带计算器
- 四、其他实用函数:杂项工具百宝箱
-
- [1. 基础信息查询](#1. 基础信息查询)
- [2. 加密函数](#2. 加密函数)
- [3. ifnull():空值救星](#3. ifnull():空值救星)
- 五、实战练手:牛客经典OJ题
- 六、写在最后
MySQL内置函数入门指南|零基础也能看懂的日期/字符串/数学函数大全
很多刚接触MySQL的小伙伴,刚学会增删改查,一遇到"算两个日期差几天""把名字拼成长句""保留两位小数"这种需求就头大------总不能全靠后端代码算完再塞回数据库吧?
其实MySQL早就给你预装了一套"官方工具包"------内置函数。就像你手机自带的计算器、日历、相册,不用额外安装,写SQL的时候直接调用,一行就能搞定复杂逻辑。
今天咱们就把最常用的四大类内置函数一次性讲透,配例子、讲坑点,看完就能直接用到项目里。
一、日期时间函数:你的专属时间管理大师
做业务的时候,生日、下单时间、发帖时间、登录时间......全是日期时间数据。手动算日期差、加减天数?太容易出错了,日期函数直接帮你搞定。
核心函数速查表
| 函数名称 | 功能描述 |
|---|---|
current_date() |
获取当前日期(年月日) |
current_time() |
获取当前时间(时分秒) |
current_timestamp() |
获取当前完整时间戳(日期+时间) |
date(datetime) |
从 datetime 里提取出日期部分 |
date_add(date, interval 值 单位) |
给日期/时间加上一段时长 |
date_sub(date, interval 值 单位) |
给日期/时间减去一段时长 |
datediff(date1, date2) |
计算两个日期相差的天数 |
now() |
获取当前日期时间(和current_timestamp基本一致) |
基础用法演示
1. 获取当前时间三件套
sql
-- 获取今天日期
select current_date();
-- 结果:2017-11-19
-- 获取现在几点
select current_time();
-- 结果:13:51:21
-- 获取完整时间戳
select current_timestamp();
-- 结果:2017-11-19 13:51:48
2. 时间加减法:算几天后/几天前
date_add 和 date_sub 是一对好兄弟,单位支持 year、day、minute、second 等等。
sql
-- 10天之后是几号?
select date_add('2017-10-28', interval 10 day);
-- 结果:2017-11-07
-- 2天之前是几号?
select date_sub('2017-10-1', interval 2 day);
-- 结果:2017-09-29
3. 算日子差:两个日期隔了多少天
datediff(日期1, 日期2) = 日期1 - 日期2,结果单位是天。
sql
select datediff('2017-10-10', '2016-9-1');
-- 结果:404
实战场景
场景1:记录用户生日
建表的时候直接用 current_date() 插入当天日期,不用后端代码传时间。
sql
-- 创建生日表
create table tmp(
id int primary key auto_increment,
birthday date
);
-- 插入当前日期
insert into tmp(birthday) values(current_date());
-- 查询效果
select * from tmp;
场景2:查询2分钟内发布的新帖子
论坛、留言板常见需求:"只看最新2分钟的留言"。
sql
-- 先建一张留言表
create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);
-- 插入两条测试数据,用now()插入当前时间
insert into msg(content,sendtime) values('hello1', now());
insert into msg(content,sendtime) values('hello2', now());
-- 只显示日期,不显示时间
select content, date(sendtime) from msg;
-- 查询2分钟内发布的帖子
select * from msg where date_add(sendtime, interval 2 minute) > now();
💡 理解逻辑:发布时间 + 2分钟 > 现在时间 → 说明发布还不到2分钟。
二、字符串函数:文本处理的美颜工具箱
拼接文字、查找字符、替换内容、截取子串、转大小写......这些对字符串的"修修剪剪",都可以用字符串函数在SQL里直接完成。
核心函数速查表
| 函数名称 | 功能描述 |
|---|---|
charset(str) |
返回字符串的字符集 |
concat(str1, str2, ...) |
拼接多个字符串 |
instr(string, substring) |
查找子串出现的位置,找不到返回0 |
ucase(str) / upper(str) |
转成大写 |
lcase(str) / lower(str) |
转成小写 |
left(str, length) |
从左边截取 length 个字符 |
replace(str, 旧串, 新串) |
把字符串里的旧串替换成新串 |
length(str) |
返回字符串的字节长度 |
substring(str, 起始位置, 长度) |
截取子串 |
trim(str) / ltrim / rtrim |
去除两端/左/右空格 |
strcmp(str1, str2) |
逐字符比较两个字符串大小 |
重点避坑 & 常用演示
1. length():别把"字节"当"字符"
这是初学者踩坑最多的函数!length() 返回的是字节数,不是字符数:
- 英文、数字:1个字符 = 1字节
- 中文:在utf8编码下,1个汉字 = 3字节
sql
-- 英文:长度是5
select length('hello'); -- 5
-- 中文:3个汉字,utf8下是9字节
select length('你好啊'); -- 9
✅ 如果你想算"字符数",用 char_length('你好啊'),结果是3。这个函数在开源社区被反复提醒,是新手必踩的经典坑。
2. concat():把多列拼成一句话
做报表展示的时候超好用,直接把字段拼成可读的句子。
sql
-- 把学生成绩拼成"XXX的语文是XXX分,数学是XXX分"
select concat(name, '的语文是', chinese, '分,数学是', math, '分') as '分数'
from student;
3. replace():批量替换内容
想把表里的某个字符批量换掉?不用一条条改。
sql
-- 把员工名字里的's'替换成'上海'
select replace(ename, 's', '上海'), ename from emp;
4. substring():截取指定位置字符
注意:MySQL里字符串位置是从1开始的,不是从0开始!
sql
-- 截取名字第2到第3个字符(从第2位开始,取2个)
select substring(ename, 2, 2), ename from emp;
5. 进阶小技巧:首字母小写
组合拳用法:截取首字母转小写,再拼接后面的内容。
sql
select concat(lcase(substring(ename, 1, 1)), substring(ename, 2))
from emp;
三、数学函数:数据库里的自带计算器
加减乘除、取整、取余、进制转换、随机数......简单的数学计算不用拿到代码里算,SQL里直接搞定。
核心函数速查表
| 函数名称 | 功能描述 |
|---|---|
abs(number) |
求绝对值 |
bin(十进制数) |
十进制转二进制 |
hex(十进制数) |
十进制转十六进制 |
conv(number, 原进制, 目标进制) |
任意进制转换 |
ceiling(number) |
向上取整(往大了凑整) |
floor(number) |
向下取整(往小了凑整) |
format(number, 小数位数) |
格式化数字,四舍五入保留小数 |
rand() |
返回 [0.0, 1.0) 之间的随机浮点数 |
mod(被除数, 除数) |
取模(求余数) |
常用示例
sql
-- 绝对值
select abs(-100.2); -- 100.2
-- 向上取整:只要有小数就进1
select ceiling(23.04); -- 24
-- 向下取整:小数直接砍掉
select floor(23.7); -- 23
-- 保留2位小数(四舍五入)
select format(12.3456, 2); -- 12.35
-- 生成0-1之间的随机数
select rand();
💡 开源社区常用技巧:想生成 0~100 的随机整数?
sql
select floor(rand() * 100);
四、其他实用函数:杂项工具百宝箱
还有一些零散但超好用的函数,处理用户、数据库、空值、加密等场景。
1. 基础信息查询
sql
-- 查看当前登录用户
select user();
-- 查看当前正在使用的数据库
select database();
2. 加密函数
sql
-- md5加密:生成32位的加密字符串,常用在业务里存密码(不建议明文存)
select md5('admin');
-- 结果:21232f297a57a5a743894a0e4a801fc3
-- password():MySQL自己的用户密码加密函数,是给MySQL账号用的
select password('root');
⚠️ 注意:业务系统的密码加密推荐用md5或更强的加密方式,不要用password()函数,它是MySQL内部账号专用的,在新版本MySQL中已经逐步废弃。
3. ifnull():空值救星
这是处理NULL的神器!如果第一个参数是NULL,就返回第二个参数;否则返回第一个参数。
sql
-- 不是null,返回原值
select ifnull('abc', '123'); -- abc
-- 是null,返回默认值123
select ifnull(null, '123'); -- 123
业务里高频用法:比如分数为null的时候显示0,ifnull(score, 0),完美解决空值参与计算导致结果为null的问题。
五、实战练手:牛客经典OJ题
题目
查找字符串 '10,A,B' 中逗号 , 出现的次数 cnt。
思路
总长度 - 去掉逗号后的长度 = 逗号的个数。这是字符串函数的经典组合拳,面试和刷题经常遇到。
参考解法
sql
select length('10,A,B') - length(replace('10,A,B', ',', '')) as cnt;
六、写在最后
MySQL内置函数不用死记硬背,用到的时候查一下,敲两遍就记住了。核心原则是:能在数据库里做完的计算,就别拿到应用层代码里做,效率更高,代码也更简洁。
今天讲的都是初学者最常用的函数,掌握了这些,日常开发里80%的SQL计算需求都能搞定。接下来可以多找几张表练手,试着用函数去实现不同的查询需求。