【MySQL 笔记】内置函数(Built-in Functions)详解
MySQL 提供了非常丰富且实用的内置函数,按功能大致可分为以下几大类。
掌握这些函数能让 SQL 写得更简洁、更高效,很多原本需要多表、多步逻辑的场景都可以一行函数搞定。
一、MySQL 内置函数分类速查表(最常用 Top 类别)
| 分类 | 代表性函数 | 主要用途 | 使用频率(2026年视角) |
|---|---|---|---|
| 字符串处理 | CONCAT, CONCAT_WS, SUBSTRING, LEFT, RIGHT, TRIM, REPLACE, LOWER/UPPER | 拼接、截取、替换、大小写转换 | ★★★★★ |
| 数值/数学 | ROUND, CEIL, FLOOR, ABS, RAND, TRUNCATE, MOD | 四舍五入、取整、随机数、取模 | ★★★★☆ |
| 日期/时间 | NOW(), CURDATE(), DATE_FORMAT, DATEDIFF, DATE_ADD, DATE_SUB, UNIX_TIMESTAMP | 当前时间、日期计算、格式化、时间差 | ★★★★★ |
| 聚合函数 | COUNT, SUM, AVG, MAX, MIN, GROUP_CONCAT | 统计、求和、平均、极值、字符串聚合 | ★★★★★ |
| 条件/逻辑 | IF, IFNULL, NULLIF, CASE WHEN | 条件判断、空值处理、三元表达式 | ★★★★☆ |
| 类型转换 | CAST, CONVERT, BINARY | 显式类型转换(字符串↔数字、日期等) | ★★★☆☆ |
| 加密/编码 | MD5, SHA1, SHA2, AES_ENCRYPT, BASE64_ENCODE | 密码哈希、数据加密、Base64 | ★★★☆☆ |
| JSON 函数 | JSON_EXTRACT, JSON_UNQUOTE, JSON_ARRAY, JSON_OBJECT | JSON 字段操作(MySQL 5.7+ 核心功能) | ★★★★☆(现代项目) |
| 窗口函数 | ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE, LAG, LEAD | 分组内排名、上下行对比(MySQL 8.0+) | ★★★★☆(分析型查询) |
| 系统/信息 | DATABASE(), USER(), VERSION(), LAST_INSERT_ID() | 获取当前库、用户、版本、自增ID | ★★★☆☆ |
二、最常用 Top 30 函数速记(建议背下来)
1. 字符串类(日常使用率最高)
CONCAT('Hello', ' ', 'World') → 'Hello World'
CONCAT_WS('-', '2026', '03', '17') → '2026-03-17'
SUBSTRING('abcdefgh', 3, 4) → 'cdef' -- 从第3位开始取4个
LEFT('MySQL', 2) → 'My'
RIGHT('MySQL', 3) → 'SQL'
TRIM(' hello ') → 'hello'
REPLACE('hello world', 'world', 'MySQL') → 'hello MySQL'
LOWER('Hello WORLD') → 'hello world'
UPPER('Hello world') → 'HELLO WORLD'
LENGTH('中文abc') → 7(字节数,utf8下中文占3)
CHAR_LENGTH('中文abc') → 5(字符数)
2. 日期时间类(报表/日志必备)
NOW() → 2026-03-17 18:03:45.123456
CURDATE() → 2026-03-17
CURTIME() → 18:03:45
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') → '2026-03-17 18:03:45'
DATE_FORMAT(NOW(), '%Y年%m月%d日') → '2026年03月17日'
DATEDIFF('2026-04-01', NOW()) → 15(天数差)
DATE_ADD(NOW(), INTERVAL 3 DAY) → 当前时间+3天
DATE_SUB(NOW(), INTERVAL 1 MONTH) → 当前时间-1个月
YEAR(NOW()), MONTH(NOW()), DAY(NOW()) → 2026, 3, 17
DAYOFWEEK(NOW()) → 3(周二,1=周日)
3. 条件 & 空值处理
IF( score >= 60, '及格', '不及格' )
IFNULL(phone, '未填写') → phone为空时返回'未填写'
NULLIF(value1, value2) → 如果value1=value2则返回NULL,否则返回value1
CASE WHEN score >= 90 THEN '优秀'
WHEN score >= 60 THEN '及格'
ELSE '不及格' END
4. 聚合 & 分组拼接(非常实用)
GROUP_CONCAT(name SEPARATOR ', ') → '张三, 李四, 王五'
GROUP_CONCAT(DISTINCT city) → 去重后拼接
5. 数值处理
ROUND(123.4567, 2) → 123.46
CEIL(123.1) → 124
FLOOR(123.9) → 123
RAND() → 0~1之间随机小数
6. JSON 操作(现代项目必会)
JSON_EXTRACT(data, '$.name') → 提取 name 字段
-> '$.name' → 同上(快捷写法,5.7+)
->> '$.name' → 提取并去掉引号(字符串值)
JSON_UNQUOTE(JSON_EXTRACT(data, '$.name'))
JSON_ARRAY(1,2,3) → '[1,2,3]'
JSON_OBJECT('name','张三','age',25) → {"name":"张三","age":25}
三、经典组合写法示例(面试/实战高频)
-- 1. 格式化日期 + 拼接姓名
SELECT CONCAT_WS(' ', last_name, first_name) AS full_name,
DATE_FORMAT(created_at, '%Y-%m-%d') AS register_date
FROM users;
-- 2. 空值友好显示 + 条件判断
SELECT username,
IFNULL(phone, '暂无') AS phone,
CASE WHEN gender = 1 THEN '男'
WHEN gender = 2 THEN '女'
ELSE '保密' END AS gender_text
FROM users;
-- 3. 按月统计订单金额(GROUP BY + DATE_FORMAT)
SELECT DATE_FORMAT(order_time, '%Y-%m') AS month,
COUNT(*) AS order_count,
ROUND(SUM(amount), 2) AS total_amount
FROM orders
GROUP BY month
ORDER BY month DESC;
-- 4. JSON 字段提取 + 条件
SELECT order_id,
data->>'$.receiver.name' AS receiver_name,
data->>'$.receiver.phone' AS phone
FROM orders
WHERE data->>'$.status' = 'pending';
四、2026 年建议掌握优先级
- 字符串:CONCAT_WS / SUBSTRING / REPLACE / TRIM / CHAR_LENGTH
- 日期:DATE_FORMAT / DATE_ADD/SUB / DATEDIFF / NOW() / CURDATE()
- 条件:IF / IFNULL / CASE WHEN
- 聚合:GROUP_CONCAT(分组拼接神器)
- JSON:-> / ->> / JSON_EXTRACT(前后端分离时代必备)
下一期预告建议:MySQL 窗口函数(Window Functions)完整实战(ROW_NUMBER / RANK / LAG / LEAD / NTILE 等)
有哪个函数组合你觉得特别好用/特别迷惑,欢迎留言,我们一起整理~
祝大家 SQL 写得越来越丝滑!📈