目录
一、数值函数:数据的“计算器”
1. 核心功能速览
2. 实战案例:计算销量占比
二、字符串函数:文本的“美容师”
1. 核心功能速览
2. 实战案例:修复用户名字格式
三、时间日期函数:时间的“穿梭机”
1. 核心功能速览
2. 实战案例:计算用户最后登录时间
四、流程控制函数:数据的“裁判员”
1. 核心功能速览
2. 实战案例:学生成绩分级
五、开窗函数:数据分析的“透视眼”(进阶必读)
1. 语法结构
2. 实战场景 A:组内排名(RANK vs ROW_NUMBER)
3. 实战场景 B:错位计算(LAG/LEAD)
总结
在 SQL 的世界里,函数就像是数据分析师的“魔法工具箱”。无论是处理杂乱的文本、计算复杂的财务数据,还是进行高级的排名分析,都离不开这些强大的内置函数。
很多初学者面对 ROUND、SUBSTR、OVER 这些关键词时,常常感到头大。别担心,本文不讲枯燥的定义,我们将把这些函数想象成一个个实用的工具,带你彻底搞懂 MySQL 中的四大类核心函数:数值函数、字符串函数、时间日期函数、流程控制函数,并重点攻克 SQL 中最强大的开窗函数。
一、数值函数:数据的“计算器”
数值函数主要用于处理数字,比如算账、取整、算概率等。
1. 核心功能速览
- 四舍五入与格式化:
- ROUND(X, n):标准的四舍五入,保留 n 位小数。
- FORMAT(X, n):不仅四舍五入,还会加上千分位分隔符(如 1,234.00),适合展示金额。
- 取整:
- FLOOR(x):地板函数,向下取整(比如 1.9 变成 1)。
- CEIL(x):天花板函数,向上取整(比如 1.1 变成 2)。
- 其他运算:
- MOD(X, Y):求余数(常用于判断奇偶数)。
- POW(X, Y):求 X 的 Y 次方。
- RAND():生成 0 到 1 之间的随机数。
2. 实战案例:计算销量占比
场景:有一张 tb_sales 表,记录了每个月的销量。现在要算出每个月销量占总销量的百分比,并保留 2 位小数。
— 需求:计算每个月的销量占全年总销量的百分比
SELECT
month,
sales,
— 核心逻辑:当前销量 / (子查询算出的总销量) * 100,然后四舍五入
ROUND(sales / (SELECT SUM(sales) FROM tb_sales) * 100, 2) AS '占比(%)'
FROM tb_sales;
二、字符串函数:文本的“美容师”
处理用户名、地址、描述等文本信息时,这些函数必不可少。
1. 核心功能速览
- 大小写转换:LOWER() 转小写,UPPER() 转大写。
- 拼接与替换:
- CONCAT(str1, str2):把两个字符串连起来。
- REPLACE(str, old, new):把字符串里的旧内容替换成新内容。
- 截取与长度:
- SUBSTR(str, n, m):从第 n 位开始截取 m 个字符。
- CHAR_LENGTH:字符个数(中文算1个)。
- LENGTH:存储字节长度(UTF8编码下中文通常算3个字节)。
2. 实战案例:修复用户名字格式
场景:users 表里的名字格式混乱,有的全大写,有的全小写。我们要把它修复成“首字母大写,其余小写”的标准格式。
— 需求:将 'aLice' 修复为 'Alice'
SELECT
user_id,
— 逻辑:取第1个字母转大写 + 取第2个字母到最后的字母转小写 + 拼接起来
CONCAT(UPPER(LEFT(name, 1)), LOWER(SUBSTR(name, 2))) AS '修复后的名字'
FROM users;
三、时间日期函数:时间的“穿梭机”
处理订单时间、登录日志、年龄计算等。
1. 核心功能速览
- 获取当前时间:NOW() (年月日时分秒), CURRENT_DATE() (仅日期)。
- 时间计算:
- DATE_ADD(date, INTERVAL x unit):在某个时间上加一段时间。
- DATEDIFF(date1, date2):计算两个日期相差多少天。
- 提取部分:YEAR(), MONTH(), DAY(), HOUR() 等。
- 格式化:DATE_FORMAT(date, '%Y-%m-%d') 把时间变成指定格式的字符串。
2. 实战案例:计算用户最后登录时间
场景:查询 logins 表,找出 2020年 登录过的用户,并显示他们当年的最后一次登录时间。
— 需求:查询2020年每个用户的最后一次登录时间
SELECT
user_id,
MAX(time_stamp) AS last_time
FROM
logins
WHERE
YEAR(time_stamp) = 2020 — 提取年份进行筛选
GROUP BY
user_id;
四、流程控制函数:数据的“裁判员”
根据条件判断来返回不同的值,常用于数据分类或逻辑处理。
1. 核心功能速览
- IF(条件, 值1, 值2):类似于 Excel 的 IF 函数,条件成立返回值1,否则返回值2。
- CASE WHEN:类似于 Java 的 Switch 或多重 If-Else,适合复杂的条件判断。
2. 实战案例:学生成绩分级
场景:查询 tb_score 表,将分数划分为“优秀、良好、及格、不及格”四个等级。
— 需求:根据分数显示等级
SELECT
name,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM tb_score;
五、开窗函数:数据分析的“透视眼”(进阶必读)
开窗函数(Window Function)是 MySQL 8.0 引入的重磅功能,也是 SQL 中最难理解但最强大的部分。
核心区别:
- 普通聚合(GROUP BY):把一堆数据揉成一个球(多行变一行),你会丢失明细数据。
- 开窗函数(OVER):给每一行数据装上一双“透视眼”,让它能看到周围的数据,但自己还是自己(多行变多行)。
1. 语法结构
函数名() OVER ( [PARTITION BY 分组列] [ORDER BY 排序列] )
- PARTITION BY:相当于“分组”,把大队伍拆成小队。
- ORDER BY:相当于“排序”,规定队伍按什么顺序排。
2. 实战场景 A:组内排名(RANK vs ROW_NUMBER)
场景:查询每个科目的成绩排名。
- ROW_NUMBER():强行排名(1, 2, 3),哪怕分数一样也要分先后。
- RANK():并列跳跃(1, 1, 3),两个人第一,下一个就是第三。
- DENSE_RANK():并列不跳跃(1, 1, 2),两个人第一,下一个是第二。 — 需求:按科目分组,按分数降序排名
SELECT
name,
course,
score,
DENSE_RANK() OVER (PARTITION BY course ORDER BY score DESC) as ranking
FROM tb_score;3. 实战场景 B:错位计算(LAG/LEAD)
场景:计算每个月销量与上个月的差值(环比分析)。LAG 可以让你“回头看”上一行的数据。
— 需求:计算当月销量与上月销量的差值
SELECT
month,
sales,
LAG(sales) OVER (ORDER BY month) AS pre_sales, — 获取上一行的销量
sales – LAG(sales) OVER (ORDER BY month) AS diff — 当前减去上一行
FROM tb_sales;总结
掌握这些函数,你的 SQL 能力将完成从“查数据”到“分析数据”的质变:
- 数值函数:搞定计算和精度。
- 字符串函数:搞定清洗和拼接。
- 时间函数:搞定日志和周期分析。
- 流程控制:搞定业务逻辑分类。
- 开窗函数:搞定复杂的排名、占比和同比环比分析。



