MySQL【内置函数】

【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_OBJECTJSON 字段操作(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 年建议掌握优先级

  1. 字符串:CONCAT_WS / SUBSTRING / REPLACE / TRIM / CHAR_LENGTH
  2. 日期:DATE_FORMAT / DATE_ADD/SUB / DATEDIFF / NOW() / CURDATE()
  3. 条件:IF / IFNULL / CASE WHEN
  4. 聚合:GROUP_CONCAT(分组拼接神器)
  5. JSON:-> / ->> / JSON_EXTRACT(前后端分离时代必备)

下一期预告建议:MySQL 窗口函数(Window Functions)完整实战(ROW_NUMBER / RANK / LAG / LEAD / NTILE 等)

有哪个函数组合你觉得特别好用/特别迷惑,欢迎留言,我们一起整理~
祝大家 SQL 写得越来越丝滑!📈

文章已创建 5186

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部