MySQL 函数大全
每个函数都有执行结果 —— 你懂 Excel 公式就能懂 MySQL 函数
字符串函数
数值函数
日期函数
聚合函数
流程控制
类型转换
函数是什么?就是"输入一个值,输出一个结果"的黑盒子。跟 Excel 公式一模一样——=UPPER("abc") 得到 "ABC",MySQL 里写 UPPER('abc') 也是一样。区别只是 Excel 用 = 开头,MySQL 写在 SELECT 里。
📖 怎么用这份手册?
不需要从头背到尾。按这个思路来:
① 先看分类导航——知道 SQL 函数分 6 大类(字符串/数值/日期/聚合/流程控制/类型转换),跟 Excel 的函数分类几乎一样
② 遇到需求时来查——"我要截取字符串" → 查字符串函数;"我要算日期差" → 查日期函数
③ 对照 Excel 理解——每个函数都标了 Excel 对应公式,看不懂 MySQL 的,看 Excel 的就懂了
示例数据(技术借书单表 orders)
orders 表
| id | name | category | size | amount | order_time |
| 1 | 编程入门书 | 技术 | 标准 | 18 | 2024-06-01 10:00:00 |
| 2 | 满杯橙橙 | 图书 | 标准 | 22 | 2024-06-01 10:05:00 |
| 3 | 红豆技术 | 图书馆 | 标准 | 22 | 2024-06-01 10:12:00 |
| 4 | 美式技术 | 技术 | 小杯 | 15 | 2024-06-01 10:18:00 |
| 5 | 芋泥技术 | 图书馆 | 标准 | 28 | 2024-06-01 10:25:00 |
| 6 | 算法精解 | 图书 | 标准 | 25 | 2024-06-01 10:30:00 |
| 7 | 设计模式书 | 技术 | 标准 | 20 | 2024-06-01 10:35:00 |
| 8 | 柠檬绿茶 | 图书 | 小杯 | 13 | 2024-06-01 14:00:00 |
| 9 | 焦糖技术 | 图书馆 | 标准 | 20 | 2024-06-01 14:10:00 |
| 10 | 摩卡 | 技术 | 标准 | 25 | 2024-06-01 14:20:00 |
一、字符串函数
处理文字的函数,Excel 里对应的就是 LEFT、RIGHT、MID、LEN 这些。
把多个字符串拼成一个。相当于 Excel 的 & 连接符或 CONCATENATE。
Excel: =A2&" - "&B2 或 =CONCATENATE(A2," - ",B2)
SELECT name, category, CONCAT(name, ' (', category, ')') AS info
FROM orders;
执行结果
| name | category | info |
| 编程入门书 | 技术 | 编程入门书 (图书馆) |
| 满杯橙橙 | 图书 | 满杯橙橙 (图书) |
| 美式技术 | 技术 | 美式技术 (技术) |
带分隔符的拼接(WS = With Separator),自动跳过 NULL。
Excel: =TEXTJOIN(" - ", TRUE, A2, B2, C2)
SELECT CONCAT_WS(' | ', name, category, size) AS detail
FROM orders;
执行结果
| detail |
| 编程入门书 | 技术 | 标准 |
| 满杯橙橙 | 图书 | 标准 |
| 美式技术 | 技术 | 小杯 |
截取字符串的一部分。注意 MySQL 从1开始数(不是0)!
Excel: =MID(A2, 1, 2)
-- 取前两个字
SELECT name, SUBSTRING(name, 1, 2) AS short_name
FROM orders;
执行结果
| name | short_name |
| 编程入门书 | 编程入门书 |
| 满杯橙橙 | 满杯 |
| 美式技术 | 美式 |
| 芋泥技术 | 芋泥 |
| 算法精解 | 杨枝 |
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;
执行结果
| name | byte_len | char_len | 💡 说明 |
| 编程入门书 | 12 | 4 | 4个汉字 × 3字节 = 12字节 |
| 美式技术 | 12 | 4 | 同上 |
| 设计模式书 | 6 | 2 | 2个汉字 × 3字节 = 6字节 |
注意:中文用 LENGTH 会比预期大3倍!数"几个字"用 CHAR_LENGTH。
转大写 / 转小写。对中文无效,主要用于英文。
Excel: =UPPER(A2) / =LOWER(A2)
SELECT UPPER('hello'), LOWER('WORLD');
执行结果
| UPPER('hello') | LOWER('WORLD') |
| HELLO | world |
去掉首尾空格 / 左边空格 / 右边空格。
Excel: =TRIM(A2)
SELECT TRIM(' 技术 ') AS trimmed,
LTRIM(' 技术 ') AS left_trimmed,
RTRIM(' 技术 ') AS right_trimmed;
执行结果(用 | 标记边界)
| 函数 | 结果 | 💡 |
| TRIM | |技术| | 两边空格都去掉了 |
| LTRIM | |技术 | | 只去左边,右边还留着 |
| RTRIM | | 技术| | 只去右边,左边还留着 |
替换字符串中的某部分。
Excel: =SUBSTITUTE(A2, "技术", "设计模式书")
SELECT name, REPLACE(name, '技术', '设计模式书') AS new_name
FROM orders WHERE category = '技术';
执行结果
| name | new_name |
| 编程入门书 | 编程入门书设计模式书 |
| 红豆技术 | 红豆设计模式书 |
| 芋泥技术 | 芋泥设计模式书 |
| 焦糖技术 | 焦糖设计模式书 |
从左边 / 右边取 N 个字符。
Excel: =LEFT(A2, 2) / =RIGHT(A2, 2)
SELECT name, LEFT(name, 2) AS first_two, RIGHT(name, 2) AS last_two
FROM orders;
执行结果
| name | first_two | last_two |
| 编程入门书 | 编程入门书 | 技术 |
| 满杯橙橙 | 满杯 | 橙橙 |
| 设计模式书 | 设计模式书 | 设计模式书 |
REVERSE 翻转字符串,REPEAT 重复 N 次。
SELECT REVERSE('技术'), REPEAT('好喝', 3);
执行结果
| REVERSE('技术') | REPEAT('好喝', 3) |
| 茶奶 | 好喝好喝好喝 |
LIKE 用 % 和 _ 做模糊查找,% = 任意多个字符,_ = 恰好1个字符。
Excel: Ctrl+F 查找
-- 名字里带"奶"的
SELECT * FROM orders WHERE name LIKE '%奶%';
-- 两个字的名字
SELECT * FROM orders WHERE name LIKE '__';
带"奶"的
| name | category | amount |
| 编程入门书 | 技术 | 18 |
| 红豆技术 | 图书馆 | 22 |
| 芋泥技术 | 图书馆 | 28 |
| 焦糖技术 | 图书馆 | 20 |
两个字的名字
| name | category | amount |
| 设计模式书 | 技术 | 20 |
| 摩卡 | 技术 | 25 |
二、数值函数
处理数字的函数,Excel 里对应的就是 ROUND、ABS、MOD 这些。
四舍五入到指定小数位。第二参数省略则取整。
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.14 | 3 | 3 |
-- 实际场景:算每个品类的平均金额,保留2位小数
SELECT category, ROUND(AVG(amount), 2) AS avg_amount
FROM orders GROUP BY category;
执行结果
| category | avg_amount |
| 技术 | 22.00 |
| 图书 | 20.00 |
| 技术 | 20.00 |
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) |
| 4 | 4 | 3 | 3 |
💡 记忆:CEIL 天花板往上顶,FLOOR 地板往下压
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) |
| 15 | 15 | 2 | 0 |
💡 MOD(22,5) = 22÷5 = 4余2,所以结果是2。20÷5=4余0
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) |
| 8 | 3 | 9 |
生成 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杯(每次结果不同)
| id | name | category | amount |
| 4 | 美式技术 | 技术 | 15 |
| 9 | 焦糖技术 | 图书馆 | 20 |
| 1 | 编程入门书 | 技术 | 18 |
三、日期函数
处理日期和时间,Excel 里对应 YEAR/MONTH/DAY、DATEDIFF 这些。
NOW 当前日期+时间,CURDATE 只有日期,CURTIME 只有时间。
Excel: =NOW() / =TODAY()
SELECT NOW(), CURDATE(), CURTIME();
执行结果(假设当前 2024-06-01 15:30:00)
| NOW() | CURDATE() | CURTIME() |
| 2024-06-01 15:30:00 | 2024-06-01 | 15:30:00 |
从日期里提取年/月/日/时/分。
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_time | y | m | d | h |
| 2024-06-01 10:00:00 | 2024 | 6 | 1 | 10 |
| 2024-06-01 14:00:00 | 2024 | 6 | 1 | 14 |
日期加减。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_week | next_month | three_days_ago |
| 2024-06-08 | 2024-07-01 | 2024-05-29 |
算两个日期差几天。注意:是 日期1 - 日期2,和 Excel 的 DATEDIFF 参数顺序相反!
Excel: =A2-B2(直接减就行)
SELECT DATEDIFF('2024-06-10', '2024-06-01') AS diff;
执行结果
-- 实际场景:借书单离现在过了几天
SELECT name, order_time,
DATEDIFF(CURDATE(), order_time) AS days_ago
FROM orders;
把日期格式化成你想要的显示方式。
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_time | cn_date | month_only | time_only |
| 2024-06-01 10:00:00 | 2024年06月01日 | 2024-06 | 10:00 |
| 2024-06-01 14:10:00 | 2024年06月01日 | 2024-06 | 14: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 使用(或者对全表统计)。之前的教程讲过了,这里补充几个没讲过的。
把分组内的值拼成一个字符串。这个在 Excel 里没有直接对应!是 MySQL 独有的好功能。
Excel: 没有直接对应,需要用 TEXTJOIN + IF 数组公式
-- 每个品类有哪些商品?把名字拼起来
SELECT category,
GROUP_CONCAT(name ORDER BY amount DESC SEPARATOR '、') AS items
FROM orders
GROUP BY category;
执行结果
| category | items |
| 技术 | 芋泥图书馆、红豆图书馆、焦糖图书馆、编程入门书 |
| 图书 | 算法精解、满杯橙橙、柠檬绿茶 |
| 技术 | 摩卡、设计模式书、美式技术 |
💡 按金额降序排列,最贵的排最前面。默认分隔符是逗号
统计不重复的值有多少个。等于 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;
执行结果
按品类分组
| category | size_types |
| 技术 | 3 |
| 图书 | 3 |
| 技术 | 3 |
五、流程控制函数
做条件判断的函数,Excel 里对应的就是 IF / IFS / IFERROR。
最简单的条件判断,等于 Excel 的 IF。
Excel: =IF(A2>=25, "贵", "便宜")
SELECT name, amount,
IF(amount >= 22, '贵', '便宜') AS price_level
FROM orders;
执行结果
| name | amount | price_level |
| 编程入门书 | 18 | 便宜 |
| 满杯橙橙 | 22 | 贵 |
| 美式技术 | 15 | 便宜 |
| 芋泥技术 | 28 | 贵 |
多条件判断,等于 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;
执行结果
| name | amount | level |
| 编程入门书 | 18 | 中消费 |
| 满杯橙橙 | 22 | 中消费 |
| 美式技术 | 15 | 低消费 |
| 芋泥技术 | 28 | 高消费 |
| 柠檬绿茶 | 13 | 低消费 |
IF vs CASE WHEN 怎么选?
只有2种结果(贵/便宜)→ 用 IF,简单
3种及以上结果(高/中/低)→ 用 CASE WHEN,更清晰
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 结果
| name | category | cat_safe |
| 编程入门书 | 技术 | 图书馆 |
| 新品特调 | NULL | 未分类 |
COALESCE(NULL, NULL, '技术') 结果
💡 COALESCE 比 IFNULL 更强大,可以试多个值。IFNULL 只能试一个替代值
如果 值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;
执行结果
💡 如果 cnt=0,NULLIF(0,0)=NULL,amount/NULL=NULL,不会报错
六、类型转换函数
把字符串变数字、数字变字符串、日期变字符串这些。
把一种类型转成另一种类型。
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) + 5 | 23 | 字符串'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 里而不是单元格里。