MySQL – 函数

【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 年建议掌握优先级排序

  1. 字符串:CONCAT_WS / SUBSTRING / REPLACE / TRIM / CHAR_LENGTH
  2. 日期:DATE_FORMAT / DATE_ADD / DATE_SUB / DATEDIFF / NOW() / CURDATE()
  3. 条件:IF / IFNULL / CASE WHEN(尤其是嵌套在 SELECT 里)
  4. 聚合:GROUP_CONCAT(分组内拼接神器)
  5. JSON:-> / ->> / JSON_EXTRACT(前后端分离时代标配)
  6. 窗口函数:ROW_NUMBER() / LAG() / LEAD()(分析型查询必备)

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

你目前项目里用得最多的 MySQL 函数是哪些?
有没有特别想深入的函数组合(比如日期计算、JSON 处理、字符串清洗等)?
欢迎留言,我们可以针对性继续展开~

祝大家 SQL 写得越来越优雅!✨

文章已创建 5186

发表回复

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

相关文章

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

返回顶部