MySQL 常用函数用法速查(含解释与示例)
适用:MySQL 5.7/8.0 常见用法(不同版本/SQL Mode 可能略有差异)
说明:示例中使用
SELECT ...演示,实际可用于查询、计算列、条件过滤、分组统计等。
目录
- [1. 字符串函数](#1. 字符串函数)
- [2. 数值函数](#2. 数值函数)
- [3. 日期时间函数](#3. 日期时间函数)
- [4. 聚合函数(分组统计)](#4. 聚合函数(分组统计))
- [5. 条件与空值处理](#5. 条件与空值处理)
- [6. 类型转换](#6. 类型转换)
- [7. JSON 函数(MySQL 5.7+)](#7. JSON 函数(MySQL 5.7+))
- [8. 窗口函数(MySQL 8.0+)](#8. 窗口函数(MySQL 8.0+))
- [9. 加密与编码](#9. 加密与编码)
- [10. 其它常用函数](#10. 其它常用函数)
- [11. 小贴士:性能与注意事项](#11. 小贴士:性能与注意事项)
1. 字符串函数
1.1 CONCAT / CONCAT_WS
- 作用:拼接字符串
- 语法
CONCAT(s1, s2, ...)CONCAT_WS(sep, s1, s2, ...)(带分隔符,忽略 NULL)
- 示例
sql
SELECT CONCAT('a', '-', 'b'); -- 'a-b'
SELECT CONCAT_WS(',', 'a', NULL, 'b'); -- 'a,b'
1.2 LENGTH / CHAR_LENGTH
- 作用
LENGTH(s):字节长度(受字符集影响)CHAR_LENGTH(s):字符长度
sql
SELECT LENGTH('你好'), CHAR_LENGTH('你好');
1.3 SUBSTRING / LEFT / RIGHT
- 作用:截取字符串
- 语法
SUBSTRING(s, pos, len)(pos 从 1 开始,可为负)LEFT(s, len),RIGHT(s, len)
sql
SELECT SUBSTRING('abcdef', 2, 3); -- 'bcd'
SELECT LEFT('abcdef', 2); -- 'ab'
SELECT RIGHT('abcdef', 2); -- 'ef'
1.4 REPLACE
- 作用:替换子串
sql
SELECT REPLACE('a-b-c', '-', '_'); -- 'a_b_c'
1.5 TRIM / LTRIM / RTRIM
- 作用:去空格(或指定字符)
sql
SELECT TRIM(' hi '); -- 'hi'
SELECT TRIM(BOTH '-' FROM '--hi--'); -- 'hi'
1.6 UPPER / LOWER
- 作用:大小写转换
sql
SELECT UPPER('Abc'), LOWER('Abc'); -- 'ABC', 'abc'
1.7 INSTR / LOCATE
- 作用:查找子串位置(找不到返回 0)
- 区别 :
LOCATE(substr, str, pos)支持起始位置
sql
SELECT INSTR('hello', 'll'); -- 3
SELECT LOCATE('l', 'hello', 4); -- 4
1.8 LPAD / RPAD
- 作用:左/右填充到指定长度
sql
SELECT LPAD('7', 3, '0'); -- '007'
SELECT RPAD('a', 5, '.'); -- 'a....'
2. 数值函数
2.1 ROUND / CEIL / FLOOR
- 作用
ROUND(x, d):四舍五入到 d 位CEIL(x):向上取整FLOOR(x):向下取整
sql
SELECT ROUND(3.14159, 2); -- 3.14
SELECT CEIL(1.2), FLOOR(1.8); -- 2, 1
2.2 ABS / SIGN
- 作用
ABS(x):绝对值SIGN(x):符号(-1/0/1)
sql
SELECT ABS(-10), SIGN(-10), SIGN(0), SIGN(5);
2.3 MOD
- 作用:取余
sql
SELECT MOD(10, 3); -- 1
2.4 RAND
- 作用:随机数(0~1)
sql
SELECT RAND();
3. 日期时间函数
3.1 NOW / CURDATE / CURTIME
- 作用
NOW():当前日期时间CURDATE():当前日期CURTIME():当前时间
sql
SELECT NOW(), CURDATE(), CURTIME();
3.2 DATE / TIME / YEAR / MONTH / DAY
- 作用:提取日期时间部件
sql
SELECT DATE(NOW()), TIME(NOW()), YEAR(NOW()), MONTH(NOW()), DAY(NOW());
3.3 DATE_FORMAT
- 作用:日期格式化为字符串
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
3.4 STR_TO_DATE
- 作用:字符串转日期
sql
SELECT STR_TO_DATE('2026-01-20 13:14:15', '%Y-%m-%d %H:%i:%s');
3.5 DATE_ADD / DATE_SUB
- 作用:日期加减
sql
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY);
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
3.6 TIMESTAMPDIFF
- 作用:计算差值(单位可选)
sql
SELECT TIMESTAMPDIFF(DAY, '2026-01-01', '2026-01-20'); -- 19
3.7 DATEDIFF
- 作用:两个日期相差天数(date1 - date2)
sql
SELECT DATEDIFF('2026-01-20', '2026-01-01'); -- 19
4. 聚合函数(分组统计)
常与
GROUP BY配合。注意:
COUNT(*)统计行数;COUNT(col)不统计 NULL。
4.1 COUNT / SUM / AVG / MIN / MAX
sql
SELECT
COUNT(*) AS cnt,
COUNT(score) AS cnt_score,
SUM(score) AS sum_score,
AVG(score) AS avg_score,
MIN(score) AS min_score,
MAX(score) AS max_score
FROM t;
4.2 GROUP_CONCAT
- 作用:把分组后的多行拼成一个字符串
- 常用参数 :
DISTINCT、ORDER BY、SEPARATOR
sql
SELECT dept_id, GROUP_CONCAT(name ORDER BY name SEPARATOR ',') AS names
FROM employee
GROUP BY dept_id;
5. 条件与空值处理
5.1 IF
- 作用:简单条件表达式
- 语法 :
IF(cond, v_true, v_false)
sql
SELECT IF(1=1, 'yes', 'no'); -- 'yes'
5.2 CASE WHEN
- 作用:多分支条件
sql
SELECT
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade
FROM t;
5.3 COALESCE / IFNULL / NULLIF
- 作用
COALESCE(a,b,c):返回第一个非 NULLIFNULL(a,b):a 为 NULL 则返回 bNULLIF(a,b):a=b 返回 NULL,否则返回 a
sql
SELECT COALESCE(NULL, NULL, 'x'); -- 'x'
SELECT IFNULL(NULL, 'x'); -- 'x'
SELECT NULLIF(10, 10), NULLIF(10, 9); -- NULL, 10
6. 类型转换
6.1 CAST / CONVERT
- 作用:显式类型转换(更可控)
sql
SELECT CAST('123' AS UNSIGNED); -- 123
SELECT CAST(123.45 AS DECIMAL(10,2)); -- 123.45
SELECT CONVERT('2026-01-20' , DATE);
7. JSON 函数(MySQL 5.7+)
JSON 列类型、JSON 路径:
$.a.b[0]
7.1 JSON_EXTRACT(别名 ->)
- 作用:提取 JSON 字段
sql
SELECT JSON_EXTRACT('{"a": {"b": 1}}', '$.a.b'); -- 1
SELECT '{"a": {"b": 1}}' -> '$.a.b'; -- 1
7.2 JSON_UNQUOTE(别名 ->>)
- 作用:提取并去掉引号(返回纯字符串)
sql
SELECT JSON_UNQUOTE('"hello"'); -- hello
SELECT '{"a":"x"}' ->> '$.a'; -- x
7.3 JSON_SET / JSON_REPLACE / JSON_REMOVE
sql
SELECT JSON_SET('{"a":1}', '$.b', 2); -- {"a":1,"b":2}
SELECT JSON_REPLACE('{"a":1}', '$.a', 9); -- {"a":9}
SELECT JSON_REMOVE('{"a":1,"b":2}', '$.b'); -- {"a":1}
8. 窗口函数(MySQL 8.0+)
用于"分组内排序/排名/累计",不需要把结果再聚合成一行。
8.1 ROW_NUMBER / RANK / DENSE_RANK
sql
SELECT
user_id,
score,
ROW_NUMBER() OVER (PARTITION BY class_id ORDER BY score DESC) AS rn,
RANK() OVER (PARTITION BY class_id ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (PARTITION BY class_id ORDER BY score DESC) AS drnk
FROM t;
8.2 SUM/AVG 作为窗口聚合(累计)
sql
SELECT
dt,
amount,
SUM(amount) OVER (ORDER BY dt) AS running_sum
FROM t;
9. 加密与编码
9.1 MD5 / SHA2
- 作用:生成哈希(不可逆,常用于校验/指纹;密码建议在应用层使用更安全的方案,如 bcrypt/argon2)
sql
SELECT MD5('abc');
SELECT SHA2('abc', 256);
9.2 TO_BASE64 / FROM_BASE64
sql
SELECT TO_BASE64('hello');
SELECT FROM_BASE64(TO_BASE64('hello'));
10. 其它常用函数
10.1 UUID
- 作用:生成 UUID 字符串
sql
SELECT UUID();
10.2 GREATEST / LEAST
- 作用:多值比较取最大/最小
sql
SELECT GREATEST(1, 5, 3), LEAST(1, 5, 3); -- 5, 1
10.3 DISTINCT 与函数
- 作用:对聚合输入去重
sql
SELECT COUNT(DISTINCT user_id) FROM t;
11. 小贴士:性能与注意事项
-
函数包列会影响索引
例如:
WHERE DATE(create_time) = '2026-01-20'往往无法用上create_time索引。推荐写法:
sqlWHERE create_time >= '2026-01-20' AND create_time < '2026-01-21' -
NULL 的传播
很多函数遇到 NULL 会返回 NULL(如
CONCAT在 MySQL 中:只要有 NULL 则结果为 NULL;可用CONCAT_WS或IFNULL处理)。 -
分页排序稳定性
LIMIT分页务必配合稳定的ORDER BY,否则同一页可能每次返回不同顺序。
最后更新:2026-01-20