✨ 技术成长是默默的坚持,每一次函数调用都是效率的提升!
🎬 博主简介:多年一线数据库开发经验,专注于 MySQL 性能优化与架构设计。分享实战技巧,帮你少走三年弯路。
📖 文章目录
- 前言
- 一、日期函数:处理时间相关需求
- [1.1 核心日期函数速查表](#1.1 核心日期函数速查表)
- [1.2 实战:查询最近 2 分钟发布数据](#1.2 实战:查询最近 2 分钟发布数据)
- [1.3 实战:日期提取与间隔计算](#1.3 实战:日期提取与间隔计算)
- [1.4 实战:未来 3 天生日用户提醒](#1.4 实战:未来 3 天生日用户提醒)
- 二、字符串函数:文本清洗与格式化
- [2.1 核心字符串函数速查表](#2.1 核心字符串函数速查表)
- [2.2 实战:手机号、邮箱脱敏](#2.2 实战:手机号、邮箱脱敏)
- [2.3 实战:商品标签统计与提取](#2.3 实战:商品标签统计与提取)
- [2.4 实战:订单编号格式校验](#2.4 实战:订单编号格式校验)
- 三、数学函数:数值计算与统计
- [3.1 核心数学函数速查表](#3.1 核心数学函数速查表)
- [3.2 实战:价格统计与金额格式化](#3.2 实战:价格统计与金额格式化)
- [3.3 实战:随机抽取与进制转换](#3.3 实战:随机抽取与进制转换)
- 四、通用工具函数:空值、条件与安全
- [4.1 核心工具函数速查表](#4.1 核心工具函数速查表)
- [4.2 实战:空值处理与系统信息查询](#4.2 实战:空值处理与系统信息查询)
- [4.3 实战:密码加密与安全存储](#4.3 实战:密码加密与安全存储)
- 五、函数使用避坑指南
- 六、总结
- 结语
前言
在实际业务开发中,MySQL 内置函数是简化 SQL、提升查询效率、减少应用层逻辑的核心利器。
无论是时间计算、字符串截取替换、数值统计,还是空值处理、数据加密,用好内置函数都能让一条 SQL 完成原本需要大量代码才能实现的逻辑。
很多初学者习惯把数据拉回代码里处理,不仅性能差,代码也臃肿。
本文从实战场景出发,系统讲解 MySQL 最常用的日期、字符串、数学、工具类函数,附带可直接运行的表结构、测试数据和业务案例,学完即可落地使用。
一、日期函数:处理时间相关需求
日期函数是电商、后台管理、日志系统中使用频率最高的函数,主要用于:获取当前时间、日期加减、时间差、格式化等。
1.1 核心日期函数速查表
表格
| 函数 | 说明 | 示例 |
|---|---|---|
| CURDATE() | 当前日期 | 2026-03-31 |
| CURTIME() | 当前时间 | 15:20:30 |
| NOW() | 当前日期时间 | 2026-03-31 15:20:30 |
| DATE(datetime) | 提取日期 | DATE(NOW()) |
| DATE_ADD | 日期加 | 加 7 天 / 1 月 |
| DATE_SUB | 日期减 | 减 3 天 / 2 小时 |
| DATEDIFF | 日期差(天) | DATEDIFF(d1,d2) |
| TIMESTAMPDIFF | 指定单位差 | 秒 / 分 / 时 / 天 |
| DATE_FORMAT | 日期格式化 | %Y-%m-%d %H:%i |
1.2 实战:查询最近 2 分钟发布数据
场景:留言 / 帖子 / 日志,只展示最近 2 分钟内的数据。
sql
CREATE TABLE msg (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(200) NOT NULL,
sendtime DATETIME
);
INSERT INTO msg(content,sendtime) VALUES
('Hello MySQL',NOW()),
('Hello Function',DATE_SUB(NOW(),INTERVAL 1 MINUTE)),
('Hello World',DATE_SUB(NOW(),INTERVAL 5 MINUTE));
SELECT * FROM msg
WHERE sendtime > DATE_SUB(NOW(),INTERVAL 2 MINUTE);
1.3 实战:日期提取与间隔计算
场景:订单分析,展示下单日期、距今天数、月份统计。
sql
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32),
order_time DATETIME,
amount DECIMAL(10,2)
);
INSERT INTO orders(order_no,order_time,amount) VALUES
('ORD202603010001','2026-03-01 10:30:00',299.50),
('ORD202603150002','2026-03-15 14:20:00',1899.00),
('ORD202603250003','2026-03-25 09:15:00',89.90);
SELECT
order_no,
order_time,
DATE(order_time) AS order_date,
DATEDIFF(NOW(),order_time) AS days_ago,
DATE_FORMAT(order_time,'%Y年%m月') AS order_month
FROM orders;
1.4 实战:未来 3 天生日用户提醒
场景:会员系统,查询未来 3 天过生日的用户,自动推送祝福。
sql
CREATE TABLE user_birthday (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
birthday DATE
);
INSERT INTO user_birthday(name,birthday) VALUES
('张三','1995-03-18'),
('李四','1992-04-01'),
('王五','1988-03-29'),
('赵六','2000-05-22');
SELECT
name,
birthday,
CONCAT(TIMESTAMPDIFF(YEAR,birthday,CURDATE()),'岁') AS age,
DATEDIFF(
DATE_ADD(birthday,INTERVAL YEAR(CURDATE())-YEAR(birthday) YEAR),
CURDATE()
) AS days_to_birthday
FROM user_birthday
WHERE
DATEDIFF(
DATE_ADD(birthday,INTERVAL YEAR(CURDATE())-YEAR(birthday) YEAR),
CURDATE()
) BETWEEN 0 AND 3
OR
DATEDIFF(
DATE_ADD(birthday,INTERVAL YEAR(CURDATE())+1-YEAR(birthday) YEAR),
CURDATE()
) BETWEEN 0 AND 3;
二、字符串函数:文本清洗与格式化
字符串函数用于:拼接、截取、替换、脱敏、正则匹配等,是数据展示与清洗必备。
2.1 核心字符串函数速查表
表格
| 函数 | 说明 |
|---|---|
| CONCAT | 字符串拼接 |
| CONCAT_WS | 分隔符拼接,自动忽略 NULL |
| LEFT / RIGHT | 左右截取 |
| SUBSTRING | 截取子串 |
| SUBSTRING_INDEX | 按分隔符截取 |
| LENGTH | 字节长度 |
| CHAR_LENGTH | 字符个数 |
| UPPER/LOWER | 大小写转换 |
| REPLACE | 替换 |
| TRIM | 去空格 |
| FIND_IN_SET | 逗号列表查找 |
| REGEXP | 正则匹配 |
2.2 实战:手机号、邮箱脱敏
场景:用户列表展示,手机号中间加密,邮箱前缀脱敏。
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
phone VARCHAR(20),
email VARCHAR(100)
);
INSERT INTO users(username,phone,email) VALUES
('张小明','13812348888','zhangxm@example.com'),
('李芳芳','13912349999','lifang@example.com'),
('王磊','13712340000',NULL);
SELECT
username,
CONCAT(LEFT(phone,3),'****',RIGHT(phone,4)) AS phone_masked,
CASE
WHEN email IS NOT NULL THEN
CONCAT(LEFT(email,3),'***',SUBSTRING(email,LOCATE('@',email)))
ELSE '未填写'
END AS email_masked
FROM users;
2.3 实战:商品标签统计与提取
场景:商品标签用逗号存储,统计标签数、判断是否包含某标签、提取首尾标签。
sql
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
tags VARCHAR(200),
price DECIMAL(10,2),
category_name VARCHAR(50)
);
INSERT INTO products(name,tags,price,category_name) VALUES
('华为Mate60','5G,旗舰,拍照,鸿蒙',5999,'手机'),
('iPhone 15','5G,旗舰,钛金属',6999,'手机'),
('小米14','5G,徕卡,旗舰',4299,'手机'),
('轻薄本','办公,轻薄',4599,'电脑');
SELECT
name,
tags,
(LENGTH(tags)-LENGTH(REPLACE(tags,',',''))+1) AS tag_count,
FIND_IN_SET('旗舰',tags)>0 AS has_flagship,
SUBSTRING_INDEX(tags,',',1) AS first_tag,
SUBSTRING_INDEX(tags,',',-1) AS last_tag
FROM products;
2.4 实战:订单编号格式校验
场景:订单号必须为 12 位纯数字,前 8 位日期,后 4 位流水,做格式校验。
sql
SELECT
order_no,
LENGTH(order_no)=12 AS valid_length,
order_no REGEXP '^[0-9]{12}$' AS valid_format,
LEFT(order_no,8) AS date_part,
RIGHT(order_no,4) AS serial_part,
CASE
WHEN LENGTH(order_no)=12 AND order_no REGEXP '^[0-9]{12}$'
THEN '格式正确' ELSE '格式错误'
END AS validation_result
FROM orders;
三、数学函数:数值计算与统计
用于:价格计算、取整、随机、进制转换、聚合结果格式化等。
3.1 核心数学函数速查表
表格
| 函数 | 说明 |
|---|---|
| ABS() | 绝对值 |
| CEILING() | 向上取整 |
| FLOOR() | 向下取整 |
| ROUND(n,d) | 四舍五入保留 d 位 |
| FORMAT(n,d) | 千分位格式化 |
| RAND() | 0~1 随机数 |
| CONV(n,f,t) | 进制转换 |
| MOD(n,m) | 取模 |
3.2 实战:价格统计与金额格式化
场景:按分类统计商品数量、均价、最大 / 最小价格、价格区间分布、总销售额格式化。
sql
SELECT
category_name,
COUNT(*) AS product_count,
ROUND(AVG(price),2) AS avg_price,
CEILING(MAX(price)) AS max_price_ceil,
FLOOR(MIN(price)) AS min_price_floor,
SUM(CASE WHEN price<1000 THEN 1 ELSE 0 END) AS price_0_1000,
SUM(CASE WHEN price BETWEEN 1000 AND 5000 THEN 1 ELSE 0 END) AS price_1000_5000,
SUM(CASE WHEN price>5000 THEN 1 ELSE 0 END) AS price_5000_up,
FORMAT(SUM(price),2) AS total_amount
FROM products
GROUP BY category_name;
3.3 实战:随机抽取与进制转换
场景:首页随机推荐商品;十六进制颜色转 RGB 十进制。
sql
-- 随机抽3个商品
SELECT * FROM products ORDER BY RAND() LIMIT 3;
-- 固定种子随机(结果可重复)
SELECT RAND(10) AS random_num;
-- 十六进制颜色转RGB
SELECT
color_hex,
CONV(SUBSTRING(color_hex,1,2),16,10) AS red,
CONV(SUBSTRING(color_hex,3,2),16,10) AS green,
CONV(SUBSTRING(color_hex,5,2),16,10) AS blue
FROM (SELECT 'FF5733' AS color_hex) AS t;
四、通用工具函数:空值、条件与安全
这类函数不属于日期 / 字符串 / 数学,但在业务 SQL 中极其常用,包括:空值处理、条件判断、系统信息、加密等。
4.1 核心工具函数速查表
表格
| 函数 | 说明 |
|---|---|
| IFNULL | NULL 替换 |
| COALESCE | 取第一个非 NULL |
| NULLIF | 相等返回 NULL |
| IF | 条件判断 |
| CASE WHEN | 多分支判断 |
| DATABASE/USER | 当前库 / 用户 |
| VERSION | MySQL 版本 |
| MD5/SHA2 | 加密哈希 |
4.2 实战:空值处理与系统信息查询
场景:用户信息展示,对缺失手机号、邮箱、等级做友好展示,并查询服务器环境。
sql
SELECT
username,
IFNULL(phone,'未绑定手机') AS phone_status,
COALESCE(email,phone,'无联系方式') AS contact,
CASE
WHEN status=1 THEN '正常'
WHEN status=0 THEN '禁用'
ELSE '未知'
END AS status_text
FROM users;
-- 系统信息
SELECT
DATABASE() AS db,
USER() AS user,
VERSION() AS version,
NOW() AS servertime;
4.3 实战:密码加密与安全存储
场景:用户密码不能明文存储,使用 SHA256 加密,登录时比对哈希。
sql
CREATE TABLE user_auth (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password_hash VARCHAR(64),
create_time DATETIME
);
-- 插入加密密码
INSERT INTO user_auth(username,password_hash,create_time)
VALUES('testuser',SHA2('mypassword123',256),NOW());
-- 登录验证
SELECT * FROM user_auth
WHERE username='testuser'
AND password_hash=SHA2('mypassword123',256);
注意:生产环境必须搭配盐值(salt)使用,不建议直接 MD5。
五、函数使用避坑指南
- LENGTH 是字节长度,统计汉字个数用 CHAR_LENGTH ()
- SUBSTRING 从 1 开始,不是 0
- DATEDIFF 只算天,精确到时分秒用 TIMESTAMPDIFF
- RAND () 在大数据量排序性能差,不适合百万级表随机
- IFNULL 只识别 NULL,不识别空字符串 ''
- REGEXP 默认不区分大小写,需要区分用 BINARY
- 日期 INTERVAL 单位建议大写:DAY、MONTH、SECOND
六、总结
本文覆盖了 MySQL 开发中90% 高频使用的内置函数,并全部基于真实业务场景:
- 日期函数:时间获取、间隔计算、生日提醒
- 字符串函数:脱敏、标签解析、正则校验
- 数学函数:价格统计、随机、进制转换
- 工具函数:空值处理、条件分支、密码安全
熟练使用这些函数,可以大幅减少应用层逻辑,让 SQL 更简洁、查询更高效、逻辑更统一。
结语
🍓 我是数据库实战派!专注 MySQL 实战优化与架构分享。
👀 关注我,从基础到进阶,持续输出硬核干货❤️ 点赞,让优质内容帮助更多开发者⭐ 收藏,方便随时查阅复制💬 评论聊聊你最常用的 MySQL 函数或踩过的坑
技术之路,一起稳步前行!