MySQL数据库:内置函数

文章目录

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

相关推荐
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-10-02
数据库·人工智能·深度学习·神经网络·搜索引擎
SWAGGY..1 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Android打工仔1 小时前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读
天疆说2 小时前
腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面:EGL 像素配置与窗口视觉不匹配的排查与修复
linux·数据库·腾讯会议
2603_969579282 小时前
中小团队数据库选型:MySQL vs PostgreSQL,业务场景怎么选
数据库·mysql·postgresql
martindelophy2 小时前
用自然语言剪视频:我们在 Timeline Studio 中实现了 ChatCut 对话剪辑
android·音视频
IT大白鼠3 小时前
图数据库系列 · 第 06 篇——避坑汇总:经典生产问题
数据库·nosql·图库数据库
江湖有缘3 小时前
3开源Sqlite数据库管理工具整理合集,可Docker一键部署!
数据库·sqlite·开源