☰
MySQL数据库:内置函数
2026/10/7 15:31:01 网站建设 项目流程

文章目录

  • 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:48
2. 时间加减法:算几天后/几天前

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-29
3. 算日子差:两个日期隔了多少天

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计算需求都能搞定。接下来可以多找几张表练手,试着用函数去实现不同的查询需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询