MySQL 内置函数是数据库操作中提升效率的重要工具,它们能在数据库层面直接完成数据处理,减少应用层与数据库的交互成本。以下从常用分类、核心函数解析、使用技巧三个维度进行全面梳理,帮助高效应用。
MySQL 内置函数按功能可分为:字符串函数、数值函数、日期时间函数、聚合函数、条件函数、系统函数等,覆盖数据处理的全流程。
用于字符串拼接、截取、转换等,减少应用层字符串处理逻辑。
函数 |
功能描述 |
示例 |
结果 |
CONCAT(s1,s2,...) |
拼接多个字符串(NULL 参与则返回 NULL) |
CONCAT('My', 'SQL', '5.7') |
'MySQL5.7' |
CONCAT_WS(sep,s1,...) |
用分隔符 sep 拼接(忽略 NULL) |
CONCAT_WS('-', '2025', '07', NULL) |
'2025-07' |
SUBSTRING(s,pos,len) |
从 pos 位置截取 len 长度的子串(pos 从 1 开始) |
SUBSTRING('abcdef',2,3) |
'bcd' |
TRIM(s) |
去除首尾空格 |
TRIM(' test ') |
'test' |
LOWER(s)/UPPER(s) |
转换为小写 / 大写 |
UPPER('hello') |
'HELLO' |
LENGTH(s) |
字符串字节数(UTF8 中汉字占 3 字节) |
LENGTH('你好') |
6 |
CHAR_LENGTH(s) |
字符串字符数(与编码无关) |
CHAR_LENGTH('你好') |
2 |
在数据库层完成数值运算,避免应用层二次计算。
函数 |
功能描述 |
示例 |
结果 |
ABS(n) |
绝对值 |
ABS(-3.14) |
3.14 |
ROUND(n,d) |
四舍五入保留 d 位小数(d 默认 0) |
ROUND(3.1415,2) |
3.14 |
FLOOR(n) |
向下取整(小于等于 n 的最大整数) |
FLOOR(3.9) |
3 |
CEIL(n) |
向上取整(大于等于 n 的最小整数) |
CEIL(3.1) |
4 |
MOD(m,n) |
取余(m 除以 n 的余数) |
MOD(7,3) |
1 |
RAND() |
生成 0~1 的随机数(每次调用不同) |
RAND() |
如0.82 |
高效处理时间计算,避免应用层时间格式转换错误。
函数 |
功能描述 |
示例 |
结果 |
NOW() |
当前日期时间(YYYY-MM-DD HH:MM:SS) |
NOW() |
2025-07-05 10:30:00 |
CURDATE() /CURTIME() |
当前日期 / 当前时间 |
CURDATE() |
2025-07-05 |
DATE_FORMAT(dt,format) |
格式化日期(format 为格式符) |
DATE_FORMAT(NOW(),'%Y年%m月%d日') |
'2025年07月05日' |
DATEDIFF(d1,d2) |
计算 d1 - d2 的天数(只算日期部分) |
DATEDIFF('2025-07-05','2025-06-20') |
15 |
TIMESTAMPDIFF(unit,d1,d2) |
计算 d2 - d1 的指定单位差值(unit:DAY/MONTH/YEAR 等) |
TIMESTAMPDIFF(MONTH,'2023-01-01',NOW()) |
30 (假设 2025-07) |
DATE_ADD(dt,INTERVAL expr unit) |
日期加间隔(如加 3 天) |
DATE_ADD(CURDATE(),INTERVAL 3 DAY) |
2025-07-08 |
快速完成分组统计,替代应用层循环计算。
函数 |
功能描述 |
场景示例 |
COUNT(*) |
统计所有行数(包含 NULL) |
统计总订单数:SELECT COUNT(*) FROM orders |
COUNT(列名) |
统计列中非 NULL 的行数 |
统计有手机号的用户数:SELECT COUNT(phone) FROM users |
SUM(列名) |
列值求和(忽略 NULL) |
计算订单总金额:SELECT SUM(amount) FROM orders |
AVG(列名) |
列值平均值(忽略 NULL) |
计算平均成绩:SELECT AVG(score) FROM exam |
MAX(列名)/MIN(列名) |
列值最大 / 最小值 |
查询最高工资:SELECT MAX(salary) FROM employees |
注意:聚合函数常与GROUP BY
配合,实现分组统计(如按分类统计商品数)。
在 SQL 中直接实现条件判断,减少应用层逻辑。
函数 |
功能描述 |
示例 |
结果(假设 score=85) |
IF(cond,true_res,false_res) |
条件判断(cond 为真返回 true_res,否则 false_res) |
IF(score>=60,'及格','不及格') |
'及格' |
IFNULL(expr1,expr2) |
若 expr1 为 NULL 则返回 expr2,否则返回 expr1 |
IFNULL(user.avatar,'default.png') |
若 avatar 为 NULL 则返回默认头像 |
CASE 函数 |
多分支判断(两种形式) |
分数分级:
CASE WHEN score>=90 THEN 'A' WHEN score>=80 THEN 'B' ELSE 'C' END |
'B' |
快速获取数据库元信息,辅助运维或日志记录。
函数 |
功能描述 |
示例结果 |
VERSION() |
当前 MySQL 版本 |
'8.0.32' |
DATABASE() |
当前使用的数据库名 |
'test_db' |
USER() |
当前登录用户(格式:user@host ) |
'root@localhost' |
-
优先在数据库层处理:用内置函数完成字符串截取、日期计算等,减少应用层与数据库的交互次数(例如:直接查询DATE_FORMAT(create_time,'%Y-%m')
而非查原始时间后在应用层格式化)。
-
避免函数对索引的破坏:WHERE
子句中对索引列使用函数会导致索引失效(如WHERE YEAR(create_time)=2025
),应改为范围查询(WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31'
)。
-
聚合函数配合索引:对SUM
/COUNT
等聚合列建立索引,可大幅提升统计效率(如对orders.amount
建索引,SUM(amount)
会更快)。
-
处理 NULL 值:用IFNULL
/COALESCE
将 NULL 转换为默认值,避免应用层判断(如SELECT IFNULL(price,0) FROM goods
)。
MySQL 内置函数通过在数据库层完成数据处理,减少了应用层与数据库的交互成本和数据传输量,是提升操作效率的核心工具。实际使用中需结合场景选择合适函数,并注意索引兼容性,才能最大化发挥其价值。