【MySQL 笔记】内置函数(Built-in Functions)详解
MySQL 提供了非常丰富且实用的内置函数,按照使用频率和重要性排序如下:
一、MySQL 8.x 最常用函数分类速查(2026 年视角)
| 分类 | 星级(使用频率) | 代表性函数(高频 → 低频) | 典型使用场景 |
|---|---|---|---|
| 字符串处理 | ★★★★★ | CONCAT / CONCAT_WS / SUBSTRING / LEFT / RIGHT / TRIM / REPLACE / LOWER / UPPER / LENGTH / CHAR_LENGTH | 拼接姓名、处理手机号、清洗数据、提取子串 |
| 日期时间 | ★★★★★ | NOW() / CURDATE() / CURTIME() / DATE_FORMAT / DATE_ADD / DATE_SUB / DATEDIFF / UNIX_TIMESTAMP / FROM_UNIXTIME | 报表按天/月分组、计算年龄、倒计时、时间戳转换 |
| 条件判断 | ★★★★☆ | IF / IFNULL / NULLIF / CASE WHEN … THEN … ELSE … END | 性别转换、状态中文解释、空值友好显示 |
| 聚合函数 | ★★★★★ | COUNT / SUM / AVG / MAX / MIN / GROUP_CONCAT | 统计、求和、平均、极值、字符串聚合 |
| 数值处理 | ★★★★ | ROUND / CEIL / FLOOR / TRUNCATE / ABS / RAND / MOD | 四舍五入、随机排序、百分比计算 |
| 类型转换 | ★★★☆ | CAST / CONVERT / BINARY | 字符串转数字、日期转字符串 |
| JSON 函数 | ★★★★☆ | -> / ->> / JSON_EXTRACT / JSON_UNQUOTE / JSON_ARRAY / JSON_OBJECT / JSON_CONTAINS | 前后端分离项目、配置表、扩展字段 |
| 窗口函数 | ★★★★ | ROW_NUMBER() / RANK() / DENSE_RANK() / NTILE / LAG / LEAD / FIRST_VALUE / LAST_VALUE | 分组排名、同比环比、上下行对比 |
| 加密/哈希 | ★★★ | MD5 / SHA1 / SHA2 / PASSWORD / AES_ENCRYPT / AES_DECRYPT | 密码存储、数据签名(注意:MD5/SHA1已不安全) |
| 系统信息 | ★★★ | DATABASE() / USER() / CURRENT_USER() / VERSION() / LAST_INSERT_ID() / CONNECTION_ID() | 日志记录、调试、权限判断 |
二、Top 30 高频函数速记表(建议背下来)
字符串类(日常使用率最高)
函数 示例代码 结果示例
CONCAT CONCAT(‘张’, ‘三’, ‘丰’) 张三丰
CONCAT_WS CONCAT_WS(‘ – ‘, ‘2026’, ’03’, ’18’) 2026 – 03 – 18
SUBSTRING / SUBSTR SUBSTRING(‘abcdefgh’, 3, 4) cdef
LEFT / RIGHT LEFT(‘MySQL8.4’, 5) MySQL
TRIM / LTRIM / RTRIM TRIM(‘ hello world ‘) hello world
REPLACE REPLACE(‘hello mysql’, ‘mysql’, ‘world’) hello world
LOWER / UPPER LOWER(‘HeLLo WoRLD’) hello world
LENGTH / CHAR_LENGTH LENGTH(‘中文abc’), CHAR_LENGTH(‘中文abc’) 7 / 5
LOCATE / POSITION / INSTR LOCATE(‘sql’, ‘mysql is good’) 3
日期时间类(报表/日志必备)
函数 示例代码 结果示例
NOW() / CURRENT_TIMESTAMP NOW() 2026-03-18 18:42:35.123
CURDATE() / CURRENT_DATE CURDATE() 2026-03-18
DATE_FORMAT DATE_FORMAT(NOW(), ‘%Y年%m月%d日 %H:%i’) 2026年03月18日 18:42
DATEDIFF DATEDIFF(‘2026-04-01’, NOW()) 14
DATE_ADD / DATE_SUB DATE_ADD(NOW(), INTERVAL 3 MONTH) 2026-06-18 18:42:35
TIMESTAMPDIFF TIMESTAMPDIFF(DAY, ‘2025-01-01’, NOW()) ≈442
FROM_UNIXTIME FROM_UNIXTIME(1742343755) 2026-03-18 18:42:35
UNIX_TIMESTAMP UNIX_TIMESTAMP(NOW()) 1742343755
条件 & 空值处理(最常出现在 SELECT 列表)
函数 示例代码 结果示例
IF IF(score >= 60, ‘及格’, ‘不及格’) 及格
IFNULL IFNULL(phone, ‘暂无电话’) 暂无电话
NULLIF NULLIF(status, 0) NULL(如果 status=0)
CASE WHEN CASE WHEN age < 18 THEN ‘未成年’ … END 未成年 / 成年 / 老年
三、最经典的组合写法(面试 + 生产高频)
-- 1. 拼接姓名 + 格式化日期 + 友好显示
SELECT
CONCAT_WS(' ', last_name, first_name) AS 姓名,
DATE_FORMAT(created_at, '%Y-%m-%d') AS 注册日期,
IF(gender = 1, '先生', '女士') AS 称呼
FROM users;
-- 2. 空值处理 + 状态中文 + 分页
SELECT
order_no,
IFNULL(remark, '无备注') AS 备注,
CASE status
WHEN 0 THEN '待支付'
WHEN 1 THEN '已支付'
WHEN 2 THEN '已发货'
ELSE '未知状态'
END AS 状态中文
FROM orders
WHERE created_at >= '2026-01-01'
ORDER BY created_at DESC
LIMIT 20 OFFSET 0;
-- 3. 按月统计 + 金额格式化 + 空值转 0
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS 月份,
COUNT(*) AS 订单数,
ROUND(COALESCE(SUM(amount), 0), 2) AS 总金额,
ROUND(AVG(amount), 2) AS 客单价
FROM orders
GROUP BY 月份
ORDER BY 月份 DESC;
-- 4. JSON 字段常用写法(现代项目必会)
SELECT
order_id,
data->>'$.receiver.name' AS 收货人,
data->>'$.receiver.phone' AS 手机号,
JSON_UNQUOTE(data->'$.items[0].name') AS 首件商品
FROM orders
WHERE JSON_EXTRACT(data, '$.status') = '"pending"';
四、2026 年建议掌握优先级排序
- 字符串:CONCAT_WS / SUBSTRING / REPLACE / TRIM / CHAR_LENGTH
- 日期:DATE_FORMAT / DATE_ADD / DATE_SUB / DATEDIFF / NOW() / CURDATE()
- 条件:IF / IFNULL / CASE WHEN(尤其是嵌套在 SELECT 里)
- 聚合:GROUP_CONCAT(分组内拼接神器)
- JSON:-> / ->> / JSON_EXTRACT(前后端分离时代标配)
- 窗口函数:ROW_NUMBER() / LAG() / LEAD()(分析型查询必备)
下一期预告建议:MySQL 窗口函数(Window Functions)完整实战
(ROW_NUMBER / RANK / DENSE_RANK / NTILE / LAG / LEAD / FIRST_VALUE 等)
你目前项目里用得最多的 MySQL 函数是哪些?
有没有特别想深入的函数组合(比如日期计算、JSON 处理、字符串清洗等)?
欢迎留言,我们可以针对性继续展开~
祝大家 SQL 写得越来越优雅!✨