前言
MySQL 内置函数是日常查询、数据清洗、业务计算的核心工具,能简化复杂 SQL 逻辑,避免大量后端代码处理数据。本文按课程目录分为五大模块:字符串函数、数值函数、日期函数、流程函数、函数整体小结,覆盖开发高频用法,附带可直接运行示例。
27. 基础 - 函数 - 字符串函数
字符串函数用于处理 char/varchar/text 文本字段,是模糊查询、数据脱敏、拼接展示最常用的函数。
1. 常用核心函数及示例
(1)CONCAT 字符串拼接
拼接多个字符串,字段为 null 时整体返回 null
-- 拼接姓名与手机号 SELECT CONCAT(name, '-', phone) AS user_info FROM user; -- 带分隔符拼接(推荐,规避null问题) SELECT CONCAT_WS('-', name, age, phone) AS info FROM user;
(2)LENGTH / CHAR_LENGTH 获取长度
-
LENGTH:字节长度(中文 utf8 占 3 字节)
-
CHAR_LENGTH:字符个数(中文、英文都算 1 个字符)
SELECT LENGTH('数据库'), CHAR_LENGTH('数据库'); -- 9 , 3
(3)UPPER / LOWER 大小写转换
SELECT UPPER('mysql'), LOWER('MYSQL'); -- MYSQL , mysql
(4)SUBSTRING 截取字符串
语法:SUBSTRING(字符串, 起始下标, 截取长度),下标从 1 开始
-- 截取手机号后4位 SELECT SUBSTRING(phone, 8, 4) FROM user;
(5)TRIM / LTRIM / RTRIM 去除空格
SELECT TRIM(' test '); -- 去除首尾空格 SELECT LTRIM(' test'), RTRIM('test ');
(6)REPLACE 字符串替换(脱敏神器)
-- 手机号中间4位脱敏 SELECT REPLACE(phone, SUBSTRING(phone,4,4), '****') FROM user;
(7)LPAD / RPAD 填充补位
-- 不足6位左侧补0,常用于编号格式化 SELECT LPAD('123', 6, '0'); -- 000123
28. 基础 - 函数 - 数值函数
专门处理数字字段(int、decimal、float),用于金额计算、分页取整、随机数生成。
核心函数示例
- ROUND 四舍五入
SELECT ROUND(123.456, 2); -- 保留2位小数 123.46
- CEIL / FLOOR 向上 / 向下取整
SELECT CEIL(10.1), FLOOR(10.9); -- 11 , 10
- MOD 取模(取余数)
SELECT MOD(10,3); -- 1
- ABS 取绝对值
SELECT ABS(-99); -- 99
- RAND () 生成 0~1 随机浮点数
-- 生成1-100随机整数 SELECT FLOOR(RAND() * 100) + 1;
- TRUNCATE 直接截断小数(不四舍五入)
SELECT TRUNCATE(123.999, 1); -- 123.9
29. 基础 - 函数 - 日期函数
处理 date/datetime/timestamp 时间字段,统计日活、月度报表、过期判断必备。
高频日期函数
1. 获取当前时间
SELECT NOW(); -- 年月日时分秒 2026-07-13 15:20:00 SELECT CURDATE(); -- 仅日期 2026-07-13 SELECT CURTIME(); -- 仅时间 15:20:00
2. 提取时间部分 YEAR/MONTH/DAY/HOUR
SELECT YEAR(create_time), MONTH(create_time), DAY(create_time) FROM order;
3. DATE_ADD / DATE_SUB 日期加减
-- 当前日期加7天 SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY); -- 当前时间减1个月 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
4. DATEDIFF 计算日期间隔天数
-- 计算订单距今多少天 SELECT DATEDIFF(CURDATE(), create_time) FROM order;
5. DATE_FORMAT 格式化日期(展示专用)
-- 格式化为 2026-07-13 15:20 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
6. TIMESTAMPDIFF 精准间隔(年 / 月 / 时 / 分)
-- 计算用户注册至今几个月 SELECT TIMESTAMPDIFF(MONTH, register_time, NOW()) FROM user;
30. 基础 - 函数 - 流程函数
实现 SQL 内的条件判断,替代后端 if-else,常用于状态翻译、分等级统计,类似编程语言三元运算符、if 判断。
1. IF 函数(二选一判断)
语法:IF(条件, 成立值, 不成立值)
-- 判断订单是否已支付 SELECT order_id, IF(pay_time IS NULL, '未支付', '已支付') AS pay_status FROM order;
2. IFNULL 空值兜底
字段为 NULL 时返回默认值,避免计算报错
-- 无积分默认0 SELECT IFNULL(score, 0) FROM user;
3. CASE WHEN 多分支复杂判断(最常用)
适合多状态、分区间分级场景
-- 根据消费金额划分用户等级 SELECT user_id, consume, CASE WHEN consume >= 10000 THEN 'VIP至尊' WHEN consume >= 1000 THEN 'VIP高级' ELSE '普通用户' END AS user_level FROM user;
4. NULLIF 相等返回 null
SELECT NULLIF(name, ''); -- name为空字符串则返回null
31. 基础 - 函数 - 小结
一、四大类函数适用场景总结
-
字符串函数:文本拼接、截取、脱敏、格式化、模糊处理;操作用户名、手机号、地址等文本字段。
-
数值函数:金额小数处理、取整、随机数、数学运算;订单金额、商品价格、积分计算。
-
日期函数:时间筛选、报表统计、过期判断、时间格式化;日 / 周 / 月数据统计、活动有效期判断。
-
流程函数:SQL 内部条件逻辑、状态翻译、空值兼容;简化查询结果,减少后端代码判断。
二、开发最佳实践
-
禁止在索引列外层包裹函数
WHERE YEAR(create_time) = 2026会失效索引,改用区间create_time >= '2026-01-01'。 -
优先在 SQL 处理简单逻辑 状态翻译、简单字符串脱敏用内置函数完成,减少 Java/Python 循环遍历数据。
-
空值统一用 IFNULL 兜底 数值计算时字段为 NULL 会导致结果为 NULL,提前设置默认 0 / 空字符串。
-
日期统一存储 datetime 避免用字符串存时间,无法使用日期函数、无法走时间索引。
-
脱敏逻辑写在查询层 手机号、身份证脱敏使用 REPLACE+SUBSTRING,无需修改原始数据库数据。
三、高频踩坑点
-
字符串截取 SUBSTRING 下标从 1 开始,不是 0,和编程语言习惯不同;
-
LENGTH 统计中文字节,统计文字数量用 CHAR_LENGTH;
-
RAND () 在一条 SQL 每行都会生成不同随机数,适合随机分页;
-
CASE WHEN 执行顺序从上到下,匹配第一个条件后停止;
-
CONCAT 任意参数为 NULL 整体返回 NULL,多字段拼接推荐 CONCAT_WS。
结尾
MySQL 内置函数是数据库开发的基本功,合理使用可以大幅简化业务代码、提升查询效率。四类函数覆盖 90% 日常业务场景,建议收藏本文,写报表、数据清洗、接口查询时直接复制示例 SQL 使用。后续会分享函数结合分组统计、索引优化的实战案例。
Markdown 文档完整文本(可直接复制保存为 .md 文件)
# MySQL 常用内置函数全解:字符串、数值、日期、流程控制实战教程 ## 前言 MySQL 内置函数是日常查询、数据清洗、业务计算的核心工具,能简化复杂 SQL 逻辑,避免大量后端代码处理数据。本文按课程目录分为五大模块:字符串函数、数值函数、日期函数、流程函数、函数整体小结,覆盖开发高频用法,附带可直接运行示例。 ## 27. 基础-函数-字符串函数 字符串函数用于处理 `char/varchar/text` 文本字段,是模糊查询、数据脱敏、拼接展示最常用的函数。 ### 1. 常用核心函数及示例 #### (1)CONCAT 字符串拼接 拼接多个字符串,字段为 null 时整体返回 null ```sql -- 拼接姓名与手机号 SELECT CONCAT(name, '-', phone) AS user_info FROM user; -- 带分隔符拼接(推荐,规避null问题) SELECT CONCAT_WS('-', name, age, phone) AS info FROM user;
(2)LENGTH / CHAR_LENGTH 获取长度
-
LENGTH:字节长度(中文 utf8 占 3 字节)
-
CHAR_LENGTH:字符个数(中文、英文都算 1 个字符)
SELECT LENGTH('数据库'), CHAR_LENGTH('数据库'); -- 9 , 3
(3)UPPER / LOWER 大小写转换
SELECT UPPER('mysql'), LOWER('MYSQL'); -- MYSQL , mysql
(4)SUBSTRING 截取字符串
语法:SUBSTRING(字符串, 起始下标, 截取长度),下标从 1 开始
-- 截取手机号后4位 SELECT SUBSTRING(phone, 8, 4) FROM user;
(5)TRIM / LTRIM / RTRIM 去除空格
SELECT TRIM(' test '); -- 去除首尾空格 SELECT LTRIM(' test'), RTRIM('test ');
(6)REPLACE 字符串替换(脱敏神器)
-- 手机号中间4位脱敏 SELECT REPLACE(phone, SUBSTRING(phone,4,4), '****') FROM user;
(7)LPAD / RPAD 填充补位
-- 不足6位左侧补0,常用于编号格式化 SELECT LPAD('123', 6, '0'); -- 000123
28. 基础 - 函数 - 数值函数
专门处理数字字段(int、decimal、float),用于金额计算、分页取整、随机数生成。
核心函数示例
- ROUND 四舍五入
SELECT ROUND(123.456, 2); -- 保留2位小数 123.46
- CEIL / FLOOR 向上 / 向下取整
SELECT CEIL(10.1), FLOOR(10.9); -- 11 , 10
- MOD 取模(取余数)
SELECT MOD(10,3); -- 1
- ABS 取绝对值
SELECT ABS(-99); -- 99
- RAND () 生成 0~1 随机浮点数
-- 生成1-100随机整数 SELECT FLOOR(RAND() * 100) + 1;
- TRUNCATE 直接截断小数(不四舍五入)
SELECT TRUNCATE(123.999, 1); -- 123.9
29. 基础 - 函数 - 日期函数
处理 date/datetime/timestamp 时间字段,统计日活、月度报表、过期判断必备。
高频日期函数
1. 获取当前时间
SELECT NOW(); -- 年月日时分秒 2026-07-13 15:20:00 SELECT CURDATE(); -- 仅日期 2026-07-13 SELECT CURTIME(); -- 仅时间 15:20:00
2. 提取时间部分 YEAR/MONTH/DAY/HOUR
SELECT YEAR(create_time), MONTH(create_time), DAY(create_time) FROM order;
3. DATE_ADD / DATE_SUB 日期加减
-- 当前日期加7天 SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY); -- 当前时间减1个月 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
4. DATEDIFF 计算日期间隔天数
-- 计算订单距今多少天 SELECT DATEDIFF(CURDATE(), create_time) FROM order;
5. DATE_FORMAT 格式化日期(展示专用)
-- 格式化为 2026-07-13 15:20 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
6. TIMESTAMPDIFF 精准间隔(年 / 月 / 时 / 分)
-- 计算用户注册至今几个月 SELECT TIMESTAMPDIFF(MONTH, register_time, NOW()) FROM user;
30. 基础 - 函数 - 流程函数
实现 SQL 内的条件判断,替代后端 if-else,常用于状态翻译、分等级统计,类似编程语言三元运算符、if 判断。
1. IF 函数(二选一判断)
语法:IF(条件, 成立值, 不成立值)
-- 判断订单是否已支付 SELECT order_id, IF(pay_time IS NULL, '未支付', '已支付') AS pay_status FROM order;
2. IFNULL 空值兜底
字段为 NULL 时返回默认值,避免计算报错
-- 无积分默认0 SELECT IFNULL(score, 0) FROM user;
3. CASE WHEN 多分支复杂判断(最常用)
适合多状态、分区间分级场景
-- 根据消费金额划分用户等级 SELECT user_id, consume, CASE WHEN consume >= 10000 THEN 'VIP至尊' WHEN consume >= 1000 THEN 'VIP高级' ELSE '普通用户' END AS user_level FROM user;
4. NULLIF 相等返回 null
SELECT NULLIF(name, ''); -- name为空字符串则返回null
31. 基础 - 函数 - 小结
一、四大类函数适用场景总结
-
字符串函数:文本拼接、截取、脱敏、格式化、模糊处理;操作用户名、手机号、地址等文本字段。
-
数值函数:金额小数处理、取整、随机数、数学运算;订单金额、商品价格、积分计算。
-
日期函数:时间筛选、报表统计、过期判断、时间格式化;日 / 周 / 月数据统计、活动有效期判断。
-
流程函数:SQL 内部条件逻辑、状态翻译、空值兼容;简化查询结果,减少后端代码判断。
二、开发最佳实践
-
禁止在索引列外层包裹函数
WHERE YEAR(create_time) = 2026会失效索引,改用区间create_time >= '2026-01-01'。 -
优先在 SQL 处理简单逻辑 状态翻译、简单字符串脱敏使用内置函数完成,减少 Java/Python 循环遍历数据。
-
空值统一用 IFNULL 兜底 数值计算时字段为 NULL 会导致结果为 NULL,提前设置默认 0 / 空字符串。
-
日期统一存储 datetime 避免用字符串存时间,无法使用日期函数、无法走时间索引。
-
脱敏逻辑写在查询层 手机号、身份证脱敏使用 REPLACE+SUBSTRING,无需修改原始数据库数据。
三、高频踩坑点
-
字符串截取 SUBSTRING 下标从 1 开始,不是 0,和编程语言习惯不同;
-
LENGTH 统计中文字节,统计文字数量用 CHAR_LENGTH;
-
RAND () 在一条 SQL 每行都会生成不同随机数,适合随机分页;
-
CASE WHEN 执行顺序从上到下,匹配第一个条件后停止;
-
CONCAT 任意参数为 NULL 整体返回 NULL,多字段拼接推荐 CONCAT_WS。
结尾
MySQL 内置函数是数据库开发的基本功,合理使用可以大幅简化业务代码、提升查询效率。四类函数覆盖 90% 日常业务场景,建议收藏本文,写报表、数据清洗、接口查询时直接复制示例 SQL 使用。后续会分享函数结合分组统计、索引优化的实战案例。