MySQL 函数大全

每个函数都有执行结果 —— 你懂 Excel 公式就能懂 MySQL 函数

字符串函数 数值函数 日期函数 聚合函数 流程控制 类型转换
函数是什么?就是"输入一个值,输出一个结果"的黑盒子。跟 Excel 公式一模一样——=UPPER("abc") 得到 "ABC",MySQL 里写 UPPER('abc') 也是一样。区别只是 Excel 用 = 开头,MySQL 写在 SELECT 里。
📖 怎么用这份手册?
不需要从头背到尾。按这个思路来:
先看分类导航——知道 SQL 函数分 6 大类(字符串/数值/日期/聚合/流程控制/类型转换),跟 Excel 的函数分类几乎一样
遇到需求时来查——"我要截取字符串" → 查字符串函数;"我要算日期差" → 查日期函数
对照 Excel 理解——每个函数都标了 Excel 对应公式,看不懂 MySQL 的,看 Excel 的就懂了

示例数据(技术借书单表 orders)

orders 表
idnamecategorysizeamountorder_time
1编程入门书技术标准182024-06-01 10:00:00
2满杯橙橙图书标准222024-06-01 10:05:00
3红豆技术图书馆标准222024-06-01 10:12:00
4美式技术技术小杯152024-06-01 10:18:00
5芋泥技术图书馆标准282024-06-01 10:25:00
6算法精解图书标准252024-06-01 10:30:00
7设计模式书技术标准202024-06-01 10:35:00
8柠檬绿茶图书小杯132024-06-01 14:00:00
9焦糖技术图书馆标准202024-06-01 14:10:00
10摩卡技术标准252024-06-01 14:20:00

一、字符串函数

处理文字的函数,Excel 里对应的就是 LEFT、RIGHT、MID、LEN 这些。

CONCAT(字符串1, 字符串2, ...) 字符串
把多个字符串拼成一个。相当于 Excel 的 & 连接符或 CONCATENATE。
Excel: =A2&" - "&B2 或 =CONCATENATE(A2," - ",B2)
SELECT name, category, CONCAT(name, ' (', category, ')') AS info
FROM orders;
执行结果
namecategoryinfo
编程入门书技术编程入门书 (图书馆)
满杯橙橙图书满杯橙橙 (图书)
美式技术技术美式技术 (技术)
CONCAT_WS(分隔符, 字符串1, 字符串2, ...) 字符串
带分隔符的拼接(WS = With Separator),自动跳过 NULL。
Excel: =TEXTJOIN(" - ", TRUE, A2, B2, C2)
SELECT CONCAT_WS(' | ', name, category, size) AS detail
FROM orders;
执行结果
detail
编程入门书 | 技术 | 标准
满杯橙橙 | 图书 | 标准
美式技术 | 技术 | 小杯
SUBSTRING(字符串, 起始位置, 长度) 字符串
截取字符串的一部分。注意 MySQL 从1开始数(不是0)!
Excel: =MID(A2, 1, 2)
-- 取前两个字
SELECT name, SUBSTRING(name, 1, 2) AS short_name
FROM orders;
执行结果
nameshort_name
编程入门书编程入门书
满杯橙橙满杯
美式技术美式
芋泥技术芋泥
算法精解杨枝
LENGTH(字符串) / CHAR_LENGTH(字符串) 字符串
LENGTH 返回字节数(中文3字节),CHAR_LENGTH 返回字符数(中文1字符)。大部分时候你想用的是 CHAR_LENGTH。
Excel: =LEN(A2)
SELECT name,
LENGTH(name) AS byte_len,
CHAR_LENGTH(name) AS char_len
FROM orders;
执行结果
namebyte_lenchar_len💡 说明
编程入门书1244个汉字 × 3字节 = 12字节
美式技术124同上
设计模式书622个汉字 × 3字节 = 6字节
注意:中文用 LENGTH 会比预期大3倍!数"几个字"用 CHAR_LENGTH。
UPPER(字符串) / LOWER(字符串) 字符串
转大写 / 转小写。对中文无效,主要用于英文。
Excel: =UPPER(A2) / =LOWER(A2)
SELECT UPPER('hello'), LOWER('WORLD');
执行结果
UPPER('hello')LOWER('WORLD')
HELLOworld
TRIM(字符串) / LTRIM / RTRIM 字符串
去掉首尾空格 / 左边空格 / 右边空格。
Excel: =TRIM(A2)
SELECT TRIM(' 技术 ') AS trimmed,
LTRIM(' 技术 ') AS left_trimmed,
RTRIM(' 技术 ') AS right_trimmed;
执行结果(用 | 标记边界)
函数结果💡
TRIM|技术|两边空格都去掉了
LTRIM|技术 |只去左边,右边还留着
RTRIM| 技术|只去右边,左边还留着
REPLACE(字符串, 旧子串, 新子串) 字符串
替换字符串中的某部分。
Excel: =SUBSTITUTE(A2, "技术", "设计模式书")
SELECT name, REPLACE(name, '技术', '设计模式书') AS new_name
FROM orders WHERE category = '技术';
执行结果
namenew_name
编程入门书编程入门书设计模式书
红豆技术红豆设计模式书
芋泥技术芋泥设计模式书
焦糖技术焦糖设计模式书
LEFT(字符串, N) / RIGHT(字符串, N) 字符串
从左边 / 右边取 N 个字符。
Excel: =LEFT(A2, 2) / =RIGHT(A2, 2)
SELECT name, LEFT(name, 2) AS first_two, RIGHT(name, 2) AS last_two
FROM orders;
执行结果
namefirst_twolast_two
编程入门书编程入门书技术
满杯橙橙满杯橙橙
设计模式书设计模式书设计模式书
REVERSE(字符串) / REPEAT(字符串, N) 字符串
REVERSE 翻转字符串,REPEAT 重复 N 次。
SELECT REVERSE('技术'), REPEAT('好喝', 3);
执行结果
REVERSE('技术')REPEAT('好喝', 3)
茶奶好喝好喝好喝
LIKE 模糊匹配(不是函数但是最常用) 字符串
LIKE 用 % 和 _ 做模糊查找,% = 任意多个字符,_ = 恰好1个字符。
Excel: Ctrl+F 查找
-- 名字里带"奶"的
SELECT * FROM orders WHERE name LIKE '%奶%';

-- 两个字的名字
SELECT * FROM orders WHERE name LIKE '__';
带"奶"的
namecategoryamount
编程入门书技术18
红豆技术图书馆22
芋泥技术图书馆28
焦糖技术图书馆20
两个字的名字
namecategoryamount
设计模式书技术20
摩卡技术25

二、数值函数

处理数字的函数,Excel 里对应的就是 ROUND、ABS、MOD 这些。

ROUND(数字, 小数位数) 数值
四舍五入到指定小数位。第二参数省略则取整。
Excel: =ROUND(A2, 2)
SELECT ROUND(3.1415, 2), ROUND(3.1415, 0), ROUND(3.1415);
执行结果
ROUND(3.1415, 2)ROUND(3.1415, 0)ROUND(3.1415)
3.1433
-- 实际场景:算每个品类的平均金额,保留2位小数
SELECT category, ROUND(AVG(amount), 2) AS avg_amount
FROM orders GROUP BY category;
执行结果
categoryavg_amount
技术22.00
图书20.00
技术20.00
CEIL(数字) / FLOOR(数字) 数值
CEIL 向上取整(天花板),FLOOR 向下取整(地板)。
Excel: =CEILING.MATH(A2) / =FLOOR.MATH(A2)
SELECT CEIL(3.2), CEIL(3.8), FLOOR(3.2), FLOOR(3.8);
执行结果
CEIL(3.2)CEIL(3.8)FLOOR(3.2)FLOOR(3.8)
4433

💡 记忆:CEIL 天花板往上顶,FLOOR 地板往下压

ABS(数字) / MOD(数字, 除数) 数值
ABS 取绝对值(负变正),MOD 取余数。
Excel: =ABS(A2) / =MOD(A2, 3)
SELECT ABS(-15), ABS(15), MOD(22, 5), MOD(20, 5);
执行结果
ABS(-15)ABS(15)MOD(22,5)MOD(20,5)
151520

💡 MOD(22,5) = 22÷5 = 4余2,所以结果是2。20÷5=4余0

POWER(底数, 指数) / SQRT(数字) 数值
POWER 乘方,SQRT 开平方。
Excel: =POWER(2,3) / =SQRT(9)
SELECT POWER(2, 3), SQRT(9), POWER(3, 2);
执行结果
POWER(2,3)SQRT(9)POWER(3,2)
839
RAND() 数值
生成 0~1 之间的随机小数。乘 N 取整就能得到 0~N-1 的随机整数。
Excel: =RAND() / =RANDBETWEEN(1,100)
-- 随机小数
SELECT RAND();

-- 随机1~100的整数
SELECT FLOOR(RAND() * 100) + 1;

-- 随机抽3杯技术
SELECT * FROM orders ORDER BY RAND() LIMIT 3;
随机抽3杯(每次结果不同)
idnamecategoryamount
4美式技术技术15
9焦糖技术图书馆20
1编程入门书技术18

三、日期函数

处理日期和时间,Excel 里对应 YEAR/MONTH/DAY、DATEDIFF 这些。

NOW() / CURDATE() / CURTIME() 日期
NOW 当前日期+时间,CURDATE 只有日期,CURTIME 只有时间。
Excel: =NOW() / =TODAY()
SELECT NOW(), CURDATE(), CURTIME();
执行结果(假设当前 2024-06-01 15:30:00)
NOW()CURDATE()CURTIME()
2024-06-01 15:30:002024-06-0115:30:00
YEAR() / MONTH() / DAY() / HOUR() / MINUTE() 日期
从日期里提取年/月/日/时/分。
Excel: =YEAR(A2) / =MONTH(A2) / =DAY(A2)
SELECT order_time,
YEAR(order_time) AS y,
MONTH(order_time) AS m,
DAY(order_time) AS d,
HOUR(order_time) AS h
FROM orders;
执行结果
order_timeymdh
2024-06-01 10:00:0020246110
2024-06-01 14:00:0020246114
DATE_ADD(日期, INTERVAL N 单位) / DATE_SUB 日期
日期加减。DATE_ADD 往后推,DATE_SUB 往前推。单位有 DAY/MONTH/YEAR/HOUR 等。
Excel: =A2+7 或 =EDATE(A2, 1)
SELECT
DATE_ADD('2024-06-01', INTERVAL 7 DAY) AS next_week,
DATE_ADD('2024-06-01', INTERVAL 1 MONTH) AS next_month,
DATE_SUB('2024-06-01', INTERVAL 3 DAY) AS three_days_ago;
执行结果
next_weeknext_monththree_days_ago
2024-06-082024-07-012024-05-29
DATEDIFF(日期1, 日期2) 日期
算两个日期差几天。注意:是 日期1 - 日期2,和 Excel 的 DATEDIFF 参数顺序相反!
Excel: =A2-B2(直接减就行)
SELECT DATEDIFF('2024-06-10', '2024-06-01') AS diff;
执行结果
diff
9
-- 实际场景:借书单离现在过了几天
SELECT name, order_time,
DATEDIFF(CURDATE(), order_time) AS days_ago
FROM orders;
DATE_FORMAT(日期, 格式) 日期
把日期格式化成你想要的显示方式。
Excel: =TEXT(A2, "yyyy年mm月dd日")
SELECT order_time,
DATE_FORMAT(order_time, '%Y年%m月%d日') AS cn_date,
DATE_FORMAT(order_time, '%Y-%m') AS month_only,
DATE_FORMAT(order_time, '%H:%i') AS time_only
FROM orders;
执行结果
order_timecn_datemonth_onlytime_only
2024-06-01 10:00:002024年06月01日2024-0610:00
2024-06-01 14:10:002024年06月01日2024-0614:10
常用格式符速查:
%Y = 4位年(2024)   %m = 2位月(06)   %d = 2位日(01)
%H = 24小时(14)   %i = 分钟(30)   %s = 秒(00)
注意:MySQL 的 %m 和 Excel 的 mm 不一样,MySQL 里 %m 是月不是分!

四、聚合函数

用来做统计的函数,必须搭配 GROUP BY 使用(或者对全表统计)。之前的教程讲过了,这里补充几个没讲过的。

GROUP_CONCAT(列 [ORDER BY ...] SEPARATOR '分隔符') 聚合
把分组内的值拼成一个字符串。这个在 Excel 里没有直接对应!是 MySQL 独有的好功能。
Excel: 没有直接对应,需要用 TEXTJOIN + IF 数组公式
-- 每个品类有哪些商品?把名字拼起来
SELECT category,
GROUP_CONCAT(name ORDER BY amount DESC SEPARATOR '、') AS items
FROM orders
GROUP BY category;
执行结果
categoryitems
技术芋泥图书馆、红豆图书馆、焦糖图书馆、编程入门书
图书算法精解、满杯橙橙、柠檬绿茶
技术摩卡、设计模式书、美式技术

💡 按金额降序排列,最贵的排最前面。默认分隔符是逗号

COUNT(DISTINCT 列) 聚合
统计不重复的值有多少个。等于 COUNT + DISTINCT 合体。
Excel: 在透视表里勾选"非重复计数"
-- 有多少种不同的杯型?
SELECT COUNT(DISTINCT size) AS size_types
FROM orders;

-- 每个品类有多少种不同的杯型?
SELECT category, COUNT(DISTINCT size) AS size_types
FROM orders GROUP BY category;
执行结果
size_types
3
按品类分组
categorysize_types
技术3
图书3
技术3

五、流程控制函数

做条件判断的函数,Excel 里对应的就是 IF / IFS / IFERROR。

IF(条件, 真时返回, 假时返回) 流程
最简单的条件判断,等于 Excel 的 IF。
Excel: =IF(A2>=25, "贵", "便宜")
SELECT name, amount,
IF(amount >= 22, '贵', '便宜') AS price_level
FROM orders;
执行结果
nameamountprice_level
编程入门书18便宜
满杯橙橙22
美式技术15便宜
芋泥技术28
CASE WHEN ... THEN ... ELSE ... END 流程
多条件判断,等于 Excel 的 IFS。比 IF 更强大,可以有很多个 WHEN。
Excel: =IFS(A2>=25,"高", A2>=18,"中", TRUE,"低")
SELECT name, amount,
CASE
WHEN amount >= 25 THEN '高消费'
WHEN amount >= 18 THEN '中消费'
ELSE '低消费'
END AS level
FROM orders;
执行结果
nameamountlevel
编程入门书18中消费
满杯橙橙22中消费
美式技术15低消费
芋泥技术28高消费
柠檬绿茶13低消费
IF vs CASE WHEN 怎么选?
只有2种结果(贵/便宜)→ 用 IF,简单
3种及以上结果(高/中/低)→ 用 CASE WHEN,更清晰
IFNULL(值, 替代值) / COALESCE(值1, 值2, ...) 流程
IFNULL:如果是NULL就替换成指定值。COALESCE:取第一个非NULL的值。
Excel: =IFERROR(VLOOKUP(...), "无") 或 =IF(A2="", "默认", A2)
-- 假设有一条借书单的 category 是 NULL
SELECT name, category,
IFNULL(category, '未分类') AS cat_safe
FROM orders;

-- COALESCE:取第一个非NULL的值
SELECT COALESCE(NULL, NULL, '技术') AS result;
IFNULL 结果
namecategorycat_safe
编程入门书技术图书馆
新品特调NULL未分类
COALESCE(NULL, NULL, '技术') 结果
result
技术

💡 COALESCE 比 IFNULL 更强大,可以试多个值。IFNULL 只能试一个替代值

NULLIF(值1, 值2) 流程
如果 值1=值2 就返回 NULL,否则返回 值1。用来避免"除以0"。
-- 避免"除以0"报错
SELECT amount / NULLIF(cnt, 0) AS avg_price
FROM (SELECT SUM(amount) AS amount, COUNT(*) AS cnt FROM orders) t;
执行结果
avg_price
20.3000

💡 如果 cnt=0,NULLIF(0,0)=NULL,amount/NULL=NULL,不会报错

六、类型转换函数

把字符串变数字、数字变字符串、日期变字符串这些。

CAST(值 AS 类型) 转换
把一种类型转成另一种类型。
Excel: =VALUE("123") / =TEXT(123, "0")
-- 字符串转数字
SELECT CAST('18' AS DECIMAL) + 5;

-- 数字转字符串(拼接时不会变成加法)
SELECT CONCAT('金额:', CAST(amount AS CHAR)) AS info
FROM orders;

-- 日期转字符串
SELECT CAST(order_time AS DATE) AS date_only
FROM orders;
执行结果
表达式结果💡
CAST('18' AS DECIMAL) + 523字符串'18'变成数字18,再加5
CONCAT('金额:', CAST(18 AS CHAR))金额:18数字18变成字符串'18'再拼接
CAST('2024-06-01 10:00:00' AS DATE)2024-06-01时间部分被丢掉了
常见坑:SELECT '18' + 5 在 MySQL 里结果是 23(自动转数字),但 SELECT '18abc' + 5 结果是 23 加一个警告('18abc' 只取了开头的18)。最好显式用 CAST 转换,别依赖隐式转换。

总结速查:6类30+函数一览

分类函数Excel 对应用途
字符串CONCAT()=A2&B2拼接字符串
CONCAT_WS()=TEXTJOIN()带分隔符拼接
SUBSTRING()=MID()截取子串
LEFT() / RIGHT()=LEFT() / =RIGHT()从左/右取N个字
LENGTH() / CHAR_LENGTH()=LEN()字节长度 / 字符长度
UPPER() / LOWER()=UPPER() / =LOWER()转大/小写
TRIM()=TRIM()去空格
REPLACE()=SUBSTITUTE()替换子串
数值ROUND()=ROUND()四舍五入
CEIL() / FLOOR()=CEILING() / =FLOOR()向上/下取整
ABS()=ABS()绝对值
MOD()=MOD()取余数
RAND()=RAND()随机数
日期NOW() / CURDATE()=NOW() / =TODAY()当前时间/日期
YEAR() / MONTH() / DAY()=YEAR() / =MONTH() / =DAY()提取年月日
DATE_ADD() / DATE_SUB()=A2+7日期加减
DATEDIFF()=A2-B2日期差几天
DATE_FORMAT()=TEXT(A2,"yyyy-mm-dd")日期格式化
HOUR() / MINUTE()=HOUR() / =MINUTE()提取时分
聚合GROUP_CONCAT()TEXTJOIN+IF数组分组内拼字符串
COUNT(DISTINCT)透视表非重复计数统计不同值个数
流程控制IF()=IF()二选一
CASE WHEN=IFS()多条件分支
IFNULL()=IFERROR()NULL替换
COALESCE()=IFNA()取第一个非NULL
类型转换CAST()=VALUE() / =TEXT()类型转换
一个规律:MySQL 的函数名和 Excel 的函数名大部分是一样的!
ROUND、ABS、MOD、UPPER、LOWER、LEFT、RIGHT、TRIM、REPLACE、LEN→CHAR_LENGTH...
你会 Excel,MySQL 函数就已经会了一大半。区别只是写在 SELECT 里而不是单元格里。