✨ 技术成长是默默的坚持每一次函数调用都是效率的提升 博主简介多年一线数据库开发经验专注于 MySQL 性能优化与架构设计。分享实战技巧帮你少走三年弯路。 文章目录前言一、日期函数处理时间相关需求1.1 核心日期函数速查表1.2 实战查询最近 2 分钟发布数据1.3 实战日期提取与间隔计算1.4 实战未来 3 天生日用户提醒二、字符串函数文本清洗与格式化2.1 核心字符串函数速查表2.2 实战手机号、邮箱脱敏2.3 实战商品标签统计与提取2.4 实战订单编号格式校验三、数学函数数值计算与统计3.1 核心数学函数速查表3.2 实战价格统计与金额格式化3.3 实战随机抽取与进制转换四、通用工具函数空值、条件与安全4.1 核心工具函数速查表4.2 实战空值处理与系统信息查询4.3 实战密码加密与安全存储五、函数使用避坑指南六、总结结语前言在实际业务开发中MySQL 内置函数是简化 SQL、提升查询效率、减少应用层逻辑的核心利器。无论是时间计算、字符串截取替换、数值统计还是空值处理、数据加密用好内置函数都能让一条 SQL 完成原本需要大量代码才能实现的逻辑。很多初学者习惯把数据拉回代码里处理不仅性能差代码也臃肿。本文从实战场景出发系统讲解 MySQL 最常用的日期、字符串、数学、工具类函数附带可直接运行的表结构、测试数据和业务案例学完即可落地使用。一、日期函数处理时间相关需求日期函数是电商、后台管理、日志系统中使用频率最高的函数主要用于获取当前时间、日期加减、时间差、格式化等。1.1 核心日期函数速查表表格函数说明示例CURDATE()当前日期2026-03-31CURTIME()当前时间15:20:30NOW()当前日期时间2026-03-31 15:20:30DATE(datetime)提取日期DATE(NOW())DATE_ADD日期加加 7 天 / 1 月DATE_SUB日期减减 3 天 / 2 小时DATEDIFF日期差天DATEDIFF(d1,d2)TIMESTAMPDIFF指定单位差秒 / 分 / 时 / 天DATE_FORMAT日期格式化%Y-%m-%d %H:%i1.2 实战查询最近 2 分钟发布数据场景留言 / 帖子 / 日志只展示最近 2 分钟内的数据。sqlCREATE 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 实战日期提取与间隔计算场景订单分析展示下单日期、距今天数、月份统计。sqlCREATE 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 天过生日的用户自动推送祝福。sqlCREATE 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分隔符拼接自动忽略 NULLLEFT / RIGHT左右截取SUBSTRING截取子串SUBSTRING_INDEX按分隔符截取LENGTH字节长度CHAR_LENGTH字符个数UPPER/LOWER大小写转换REPLACE替换TRIM去空格FIND_IN_SET逗号列表查找REGEXP正则匹配2.2 实战手机号、邮箱脱敏场景用户列表展示手机号中间加密邮箱前缀脱敏。sqlCREATE 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,zhangxmexample.com), (李芳芳,13912349999,lifangexample.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 实战商品标签统计与提取场景商品标签用逗号存储统计标签数、判断是否包含某标签、提取首尾标签。sqlCREATE 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 位流水做格式校验。sqlSELECT 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 实战价格统计与金额格式化场景按分类统计商品数量、均价、最大 / 最小价格、价格区间分布、总销售额格式化。sqlSELECT 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 price1000 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 price5000 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 核心工具函数速查表表格函数说明IFNULLNULL 替换COALESCE取第一个非 NULLNULLIF相等返回 NULLIF条件判断CASE WHEN多分支判断DATABASE/USER当前库 / 用户VERSIONMySQL 版本MD5/SHA2加密哈希4.2 实战空值处理与系统信息查询场景用户信息展示对缺失手机号、邮箱、等级做友好展示并查询服务器环境。sqlSELECT username, IFNULL(phone,未绑定手机) AS phone_status, COALESCE(email,phone,无联系方式) AS contact, CASE WHEN status1 THEN 正常 WHEN status0 THEN 禁用 ELSE 未知 END AS status_text FROM users; -- 系统信息 SELECT DATABASE() AS db, USER() AS user, VERSION() AS version, NOW() AS servertime;4.3 实战密码加密与安全存储场景用户密码不能明文存储使用 SHA256 加密登录时比对哈希。sqlCREATE 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 usernametestuser AND password_hashSHA2(mypassword123,256);注意生产环境必须搭配盐值salt使用不建议直接 MD5。五、函数使用避坑指南LENGTH 是字节长度统计汉字个数用 CHAR_LENGTH ()SUBSTRING 从 1 开始不是 0DATEDIFF 只算天精确到时分秒用 TIMESTAMPDIFFRAND () 在大数据量排序性能差不适合百万级表随机IFNULL 只识别 NULL不识别空字符串 REGEXP 默认不区分大小写需要区分用 BINARY日期 INTERVAL 单位建议大写DAY、MONTH、SECOND六、总结本文覆盖了 MySQL 开发中90% 高频使用的内置函数并全部基于真实业务场景日期函数时间获取、间隔计算、生日提醒字符串函数脱敏、标签解析、正则校验数学函数价格统计、随机、进制转换工具函数空值处理、条件分支、密码安全熟练使用这些函数可以大幅减少应用层逻辑让 SQL 更简洁、查询更高效、逻辑更统一。结语 我是数据库实战派专注 MySQL 实战优化与架构分享。 关注我从基础到进阶持续输出硬核干货❤️ 点赞让优质内容帮助更多开发者⭐ 收藏方便随时查阅复制 评论聊聊你最常用的 MySQL 函数或踩过的坑技术之路一起稳步前行