文章目录
- MySQL内置函数入门指南|零基础也能看懂的日期/字符串/数学函数大全
- 一、日期时间函数:你的专属时间管理大师
- 核心函数速查表
- 基础用法演示
- 1. 获取当前时间三件套
- 2. 时间加减法:算几天后/几天前
- 3. 算日子差:两个日期隔了多少天
- 实战场景
- 场景1:记录用户生日
- 场景2:查询2分钟内发布的新帖子
- 二、字符串函数:文本处理的美颜工具箱
- 核心函数速查表
- 重点避坑 & 常用演示
- 1. length():别把“字节”当“字符”
- 2. concat():把多列拼成一句话
- 3. replace():批量替换内容
- 4. substring():截取指定位置字符
- 5. 进阶小技巧:首字母小写
- 三、数学函数:数据库里的自带计算器
- 核心函数速查表
- 常用示例
- 四、其他实用函数:杂项工具百宝箱
- 1. 基础信息查询
- 2. 加密函数
- 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. 获取当前时间三件套
-- 获取今天日期selectcurrent_date();-- 结果:2017-11-19-- 获取现在几点selectcurrent_time();-- 结果:13:51:21-- 获取完整时间戳selectcurrent_timestamp();-- 结果:2017-11-19 13:51:482. 时间加减法:算几天后/几天前
date_add和date_sub是一对好兄弟,单位支持year、day、minute、second等等。
-- 10天之后是几号?selectdate_add('2017-10-28',interval10day);-- 结果:2017-11-07-- 2天之前是几号?selectdate_sub('2017-10-1',interval2day);-- 结果:2017-09-293. 算日子差:两个日期隔了多少天
datediff(日期1, 日期2)= 日期1 - 日期2,结果单位是天。
selectdatediff('2017-10-10','2016-9-1');-- 结果:404实战场景
场景1:记录用户生日
建表的时候直接用current_date()插入当天日期,不用后端代码传时间。
-- 创建生日表createtabletmp(idintprimarykeyauto_increment,birthdaydate);-- 插入当前日期insertintotmp(birthday)values(current_date());-- 查询效果select*fromtmp;场景2:查询2分钟内发布的新帖子
论坛、留言板常见需求:“只看最新2分钟的留言”。
-- 先建一张留言表createtablemsg(idintprimarykeyauto_increment,contentvarchar(30)notnull,sendtimedatetime);-- 插入两条测试数据,用now()插入当前时间insertintomsg(content,sendtime)values('hello1',now());insertintomsg(content,sendtime)values('hello2',now());-- 只显示日期,不显示时间selectcontent,date(sendtime)frommsg;-- 查询2分钟内发布的帖子select*frommsgwheredate_add(sendtime,interval2minute)>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字节
-- 英文:长度是5selectlength('hello');-- 5-- 中文:3个汉字,utf8下是9字节selectlength('你好啊');-- 9✅ 如果你想算“字符数”,用char_length('你好啊'),结果是3。这个函数在开源社区被反复提醒,是新手必踩的经典坑。
2. concat():把多列拼成一句话
做报表展示的时候超好用,直接把字段拼成可读的句子。
-- 把学生成绩拼成“XXX的语文是XXX分,数学是XXX分”selectconcat(name,'的语文是',chinese,'分,数学是',math,'分')as'分数'fromstudent;3. replace():批量替换内容
想把表里的某个字符批量换掉?不用一条条改。
-- 把员工名字里的's'替换成'上海'selectreplace(ename,'s','上海'),enamefromemp;4. substring():截取指定位置字符
注意:MySQL里字符串位置是从1开始的,不是从0开始!
-- 截取名字第2到第3个字符(从第2位开始,取2个)selectsubstring(ename,2,2),enamefromemp;5. 进阶小技巧:首字母小写
组合拳用法:截取首字母转小写,再拼接后面的内容。
selectconcat(lcase(substring(ename,1,1)),substring(ename,2))fromemp;三、数学函数:数据库里的自带计算器
加减乘除、取整、取余、进制转换、随机数……简单的数学计算不用拿到代码里算,SQL里直接搞定。
核心函数速查表
| 函数名称 | 功能描述 |
|---|---|
abs(number) | 求绝对值 |
bin(十进制数) | 十进制转二进制 |
hex(十进制数) | 十进制转十六进制 |
conv(number, 原进制, 目标进制) | 任意进制转换 |
ceiling(number) | 向上取整(往大了凑整) |
floor(number) | 向下取整(往小了凑整) |
format(number, 小数位数) | 格式化数字,四舍五入保留小数 |
rand() | 返回 [0.0, 1.0) 之间的随机浮点数 |
mod(被除数, 除数) | 取模(求余数) |
常用示例
-- 绝对值selectabs(-100.2);-- 100.2-- 向上取整:只要有小数就进1selectceiling(23.04);-- 24-- 向下取整:小数直接砍掉selectfloor(23.7);-- 23-- 保留2位小数(四舍五入)selectformat(12.3456,2);-- 12.35-- 生成0-1之间的随机数selectrand();💡 开源社区常用技巧:想生成 0~100 的随机整数?
selectfloor(rand()*100);四、其他实用函数:杂项工具百宝箱
还有一些零散但超好用的函数,处理用户、数据库、空值、加密等场景。
1. 基础信息查询
-- 查看当前登录用户selectuser();-- 查看当前正在使用的数据库selectdatabase();2. 加密函数
-- md5加密:生成32位的加密字符串,常用在业务里存密码(不建议明文存)selectmd5('admin');-- 结果:21232f297a57a5a743894a0e4a801fc3-- password():MySQL自己的用户密码加密函数,是给MySQL账号用的selectpassword('root');⚠️ 注意:业务系统的密码加密推荐用md5或更强的加密方式,不要用password()函数,它是MySQL内部账号专用的,在新版本MySQL中已经逐步废弃。
3. ifnull():空值救星
这是处理NULL的神器!如果第一个参数是NULL,就返回第二个参数;否则返回第一个参数。
-- 不是null,返回原值selectifnull('abc','123');-- abc-- 是null,返回默认值123selectifnull(null,'123');-- 123业务里高频用法:比如分数为null的时候显示0,ifnull(score, 0),完美解决空值参与计算导致结果为null的问题。
五、实战练手:牛客经典OJ题
题目
查找字符串'10,A,B'中逗号,出现的次数 cnt。
思路
总长度 - 去掉逗号后的长度 = 逗号的个数。这是字符串函数的经典组合拳,面试和刷题经常遇到。
参考解法
selectlength('10,A,B')-length(replace('10,A,B',',',''))ascnt;六、写在最后
MySQL内置函数不用死记硬背,用到的时候查一下,敲两遍就记住了。核心原则是:能在数据库里做完的计算,就别拿到应用层代码里做,效率更高,代码也更简洁。
今天讲的都是初学者最常用的函数,掌握了这些,日常开发里80%的SQL计算需求都能搞定。接下来可以多找几张表练手,试着用函数去实现不同的查询需求。