跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL算法

MySQL 窗口函数与 JSON 数据类型实战教程

MySQL 窗口函数在不压缩结果集前提下进行分组排序聚合计算,适用于展示明细加统计信息场景。JSON 数据类型允许灵活存储非结构化数据,支持快速查询操作且无需频繁修改表结构。内容包含窗口函数分类语法详解及员工薪资排名、部门统计实战案例,同时讲解 JSON 数据的插入查询修改方法及用户配置存储应用。掌握这两项高级特性有助于应对复杂业务需求。

PhpPioneer发布于 2026/3/21更新于 2026/6/1722 浏览
MySQL 窗口函数与 JSON 数据类型实战教程

引言

在现代开发中,窗口函数能轻松搞定复杂排名、分组统计,JSON 数据类型可灵活处理非结构化数据,这两大高级特性已成为后端开发者提升效率的利器。

一、MYSQL 高级特性:不止于简单存储

在传统认知中,MySQL 常被当作'简单的关系型数据库',仅用于存储规整的行数据。但随着业务场景的复杂化,仅靠基础的 CRUD 操作早已无法满足需求。窗口函数(Window Functions)和 JSON 数据类型支持,正是 MySQL 为适配现代开发推出的核心高级特性,既能解决复杂的数据统计问题,又能灵活应对非结构化数据存储需求。

二、窗口函数:复杂统计场景的'杀手锏'

2.1 什么是窗口函数?

窗口函数,也叫分析函数,是 MySQL 8.0 及以上版本引入的重要特性。它能在不压缩结果集的前提下,对数据进行分组、排序和聚合计算,相当于为每一行数据'开一个窗口',在窗口内进行统计分析。

与传统聚合函数(SUM、AVG、COUNT 等)相比,窗口函数最大的优势的是:计算后不会合并行数据,每一行都会保留原始信息,同时新增统计结果列。这在需要展示原始数据 + 统计信息的场景中(如:展示每个员工信息 + 所在部门平均薪资),比聚合函数更高效、更简洁。

💡 核心对比:PARTITION BY 与 GROUP BY 的本质区别
很多同学容易把窗口函数里的 PARTITION BY 和传统的 GROUP BY 混淆,记住最核心的一点:是否合并数据行。

  • GROUP BY:按字段分组后,相同字段的数据会'折叠'成一行,原始的明细数据就不见了。
  • PARTITION BY:虽然也是分组,但原始数据行数不变。它是在这个分组的范围内进行统计计算,并把结果附加在每一行明细数据的后面。

这也就是为什么在需要同时展示'明细数据'和'统计信息'的场景下,窗口函数比传统聚合函数更高效、更优雅!

2.2 常用窗口函数分类与语法
2.2.1 函数分类(3 大类核心)

💡 核心分类,一目了然:

  • 排序类:RANK()、DENSE_RANK()、ROW_NUMBER()
  • 聚合类:SUM()、AVG()、COUNT()、MAX()、MIN()
  • 分析类:LAG()、LEAD()、FIRST_VALUE()、LAST_VALUE()
2.2.2 基础语法
函数名 (字段名) OVER ( PARTITION BY 分组字段 -- 可选,类似 GROUP BY ORDER BY 排序字段 [ASC/DESC] -- 可选,窗口内排序 ROWS/RANGE BETWEEN 起始位置 AND 结束位置 -- 可选,窗口范围 ) AS 别名 
2.3 实战案例:窗口函数解决实际业务问题
案例 1:员工薪资排名(排序类函数)

需求:查询所有员工信息,并显示其所在部门的薪资排名(相同薪资排名相同,不占用后续名次)。
准备数据:

CREATE TABLE emp ( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(20) NOT NULL, dept_id INT NOT NULL, salary (,)  );  emp (emp_name, dept_id, salary)  (, , ), (, , ), (, , ), (, , ), (, , ); 
DECIMAL
10
2
NOT NULL
INSERT INTO
VALUES
'张三'
1
8000.00
'李四'
1
9500.00
'王五'
1
8000.00
'赵六'
2
7500.00
'孙七'
2
10000.00

查询 SQL(使用 DENSE_RANK() 函数):

SELECT emp_id, emp_name, dept_id, salary, DENSE_RANK() OVER ( PARTITION BY dept_id ORDER BY salary DESC ) AS dept_salary_rank FROM emp; 

查询结果:

emp_idemp_namedept_idsalarydept_salary_rank
2李四19500.001
1张三18000.002
3王五18000.002
5孙七210000.001
4赵六27500.002
案例 2:部门薪资统计(聚合类函数)

需求:查询每个员工的薪资,并显示所在部门的薪资总和、平均薪资。
SQL 语句:

SELECT emp_id, emp_name, dept_id, salary, SUM(salary) OVER (PARTITION BY dept_id) AS dept_salary_total, AVG(salary) OVER (PARTITION BY dept_id) AS dept_salary_avg FROM emp; 

✅ 对比传统写法(子查询/关联查询),窗口函数无需多表关联,代码更简洁,执行效率更高!

三、JSON 数据类型:非结构化数据的'灵活存储方案'

3.1 为什么需要 JSON 数据类型?

在现代开发中,经常会遇到非结构化或半结构化数据(如:用户画像、接口返回数据、配置信息等)。如果用传统的字段存储,会存在以下问题:

  • 字段数量不确定,难以设计表结构;
  • 数据格式灵活多变,新增字段需修改表结构;
  • 数据查询和解析繁琐。

MySQL 5.7 及以上版本引入的 JSON 数据类型,完美解决了这些问题:无需固定表结构,可灵活存储复杂数据,同时支持 JSON 数据的快速查询和操作。

3.2 JSON 数据类型核心操作
3.2.1 数据插入(两种方式)

方式 1:直接插入 JSON 格式字符串

CREATE TABLE user_profile ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL UNIQUE, profile JSON NOT NULL -- JSON 类型字段 ); INSERT INTO user_profile (user_id, profile) VALUES (1, '{"name":"张三","age":25,"hobbies":["篮球","编程"],"address":{"province":"广东","city":"深圳"}}'); 

方式 2:使用 JSON_OBJECT() 函数构造 JSON

INSERT INTO user_profile (user_id, profile) VALUES (2, JSON_OBJECT( 'name', '李四', 'age', 28, 'hobbies', JSON_ARRAY('足球','阅读'), 'address', JSON_OBJECT('province','浙江','city','杭州') )); 
3.2.2 数据查询(精准定位 JSON 字段)

MySQL 提供了多种 JSON 查询函数,核心常用的有:

  • ->:提取 JSON 对象字段(返回带引号的字符串)
  • ->>:提取 JSON 对象字段(返回无引号的字符串)
  • JSON_EXTRACT(json 字段,'$.路径'):通用提取函数
  • JSON_CONTAINS(json 字段,'值', '$.路径'):判断是否包含指定值

示例:查询用户姓名、所在城市、爱好列表

SELECT user_id, profile->>'$.name' AS user_name, profile->>'$.address.city' AS city, profile->>'$.hobbies' AS hobbies, JSON_EXTRACT(profile, '$.age') AS age FROM user_profile; 

查询结果:

user_iduser_namecityhobbiesage
1张三深圳['篮球', '编程']25
2李四杭州['足球', '阅读']28
3.2.3 数据修改(JSON 字段局部更新)

无需更新整个 JSON 对象,可精准修改指定字段:

-- 修改用户年龄 UPDATE user_profile SET profile = JSON_SET(profile, '$.age', 26) WHERE user_id = 1; -- 新增用户职业字段 UPDATE user_profile SET profile = JSON_INSERT(profile, '$.job', '程序员') WHERE user_id = 1; 
3.3 实战场景:JSON 存储用户配置信息

需求:存储用户的系统配置(主题、通知开关、默认页面等),配置项可能随时新增,无需修改表结构。
使用 JSON 类型存储后,可轻松实现配置的新增、修改、查询,无需担心字段扩展性问题,比传统多字段存储更灵活。

四、总结

本文重点讲解了 MySQL 的两大高级特性:窗口函数和 JSON 数据类型支持。窗口函数打破了传统聚合函数的限制,能高效解决复杂的分组统计、排序问题;JSON 数据类型则为非结构化数据提供了灵活的存储方案,适配现代开发中多变的数据场景。

MySQL 早已不是'只能存简单行数据'的数据库,熟练掌握这些高级特性,能显著提升开发效率,轻松应对复杂业务需求。建议大家在实际项目中多实操练习,将这些技能融入到业务开发中。

目录

  1. 引言
  2. 一、MYSQL 高级特性:不止于简单存储
  3. 二、窗口函数:复杂统计场景的“杀手锏”
  4. 2.1 什么是窗口函数?
  5. 2.2 常用窗口函数分类与语法
  6. 2.2.1 函数分类(3 大类核心)
  7. 2.2.2 基础语法
  8. 2.3 实战案例:窗口函数解决实际业务问题
  9. 案例 1:员工薪资排名(排序类函数)
  10. 案例 2:部门薪资统计(聚合类函数)
  11. 三、JSON 数据类型:非结构化数据的“灵活存储方案”
  12. 3.1 为什么需要 JSON 数据类型?
  13. 3.2 JSON 数据类型核心操作
  14. 3.2.1 数据插入(两种方式)
  15. 3.2.2 数据查询(精准定位 JSON 字段)
  16. 3.2.3 数据修改(JSON 字段局部更新)
  17. 3.3 实战场景:JSON 存储用户配置信息
  18. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MySQL 互联网公司常用分库分表方案汇总
  • MySQL 表约束核心指南:从基础到外键实战
  • 基于 Dify 搭建合同审查法律文书机器人 Agent 全流程
  • 钉钉单聊机器人 Stream 模式接入实现
  • 基于 MuJoCo Gym 的机器人仿真、训练与部署流程
  • 5 款主流 AI 写小说工具测评与推荐
  • 基于 FPGA 的 EtherCAT 主站 Verilog 设计与同步算法解析
  • CppCon 2024 学习:C++ 异常在小型固件中的应用
  • OpenClaw 多 Agent 与飞书机器人配置指南
  • Stack-Chan机器人完整入门指南:从零开始构建你的可爱机器人伙伴
  • 大厂程序员职业现状与成长路径深度解析
  • 在国内环境部署 OpenClaw 个人 AI 助手搭建指南
  • MIT 室内场景识别数据集详解及 YOLOv8 训练实战
  • MISRA C++静态分析报告解读与实战指南
  • Minecraft RCON Web 控制台远程管理指南
  • Microsoft Visual C++ 运行库安装与 DLL 缺失修复指南
  • OpenClaw 视觉自动化:无需接口,让 AI 直接操作软件界面
  • Python 环境完整卸载指南(含 Python、PyCharm、Anaconda)
  • Microi 吾码与 JavaScript 技术整合及应用实践
  • openGauss 在向量数据库与 RAG 场景下的应用深度研究

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online