欢迎光临
我们一直在努力

干货整合,MySQL函数全攻略:从入门到精通

目录

一、数值函数:数据的“计算器”

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 能力将完成从“查数据”到“分析数据”的质变:

  • 数值函数:搞定计算和精度。
  • 字符串函数:搞定清洗和拼接。
  • 时间函数:搞定日志和周期分析。
  • 流程控制:搞定业务逻辑分类。
  • 开窗函数:搞定复杂的排名、占比和同比环比分析。
赞(0)
未经允许不得转载:171主机测评 » 干货整合,MySQL函数全攻略:从入门到精通
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址