MySQL实战(十五): 常用内置函数实战--日期、字符串、数学函数从入门到精通

✨ 技术成长是默默的坚持,每一次函数调用都是效率的提升!

🎬 博主简介:多年一线数据库开发经验,专注于 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。


五、函数使用避坑指南

  1. LENGTH 是字节长度,统计汉字个数用 CHAR_LENGTH ()
  2. SUBSTRING 从 1 开始,不是 0
  3. DATEDIFF 只算天,精确到时分秒用 TIMESTAMPDIFF
  4. RAND () 在大数据量排序性能差,不适合百万级表随机
  5. IFNULL 只识别 NULL,不识别空字符串 ''
  6. REGEXP 默认不区分大小写,需要区分用 BINARY
  7. 日期 INTERVAL 单位建议大写:DAY、MONTH、SECOND

六、总结

本文覆盖了 MySQL 开发中90% 高频使用的内置函数,并全部基于真实业务场景:

  • 日期函数:时间获取、间隔计算、生日提醒
  • 字符串函数:脱敏、标签解析、正则校验
  • 数学函数:价格统计、随机、进制转换
  • 工具函数:空值处理、条件分支、密码安全

熟练使用这些函数,可以大幅减少应用层逻辑,让 SQL 更简洁、查询更高效、逻辑更统一。


结语

🍓 我是数据库实战派!专注 MySQL 实战优化与架构分享。

👀 关注我,从基础到进阶,持续输出硬核干货❤️ 点赞,让优质内容帮助更多开发者⭐ 收藏,方便随时查阅复制💬 评论聊聊你最常用的 MySQL 函数或踩过的坑

技术之路,一起稳步前行!

相关推荐
Javatutouhouduan2 小时前
SQL优化从入门到精通!
java·数据库·mysql·sql优化·java面试·后端开发·java程序员
刘晨鑫12 小时前
MySQL主从复制与读写分离
数据库·mysql·adb
ClouGence2 小时前
数据迁移同步工具 CloudCanal-v5.5.0.0 发布,支持 RETL(定时扫描同步)
数据库·mysql·postgresql·oracle·sqlserver·kafka·etl
万琛2 小时前
【Flink_CEP】MySQL 动态规则 + Kafka 实时流 + Flink CEP 后缀收集的实战方案
mysql·flink·kafka
ANii_Aini2 小时前
mysql数据库保姆级安装教程-mac(一站式服务,提供资源)
数据库·sql·mysql·navicat
ego.iblacat3 小时前
MySQL 全量、增量备份与恢复
数据库·mysql
画堂秋3 小时前
云原生-Mysql
运维·mysql·云原生
qq_2837200512 小时前
MySQL技巧(九): Binlog 完整格式解析(ROW 模式,默认)
mysql·binlog·数据恢复
Java面试题总结13 小时前
MySQL篇 索引失效
数据库·mysql