导读:本期聚焦于小伙伴创作的《怎么在MySQL中利用子查询实现复杂的JSON数据提取_通过JSON_TABLE嵌套》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎么在MySQL中利用子查询实现复杂的JSON数据提取_通过JSON_TABLE嵌套》有用,将其分享出去将是对创作者最好的鼓励。

在MySQL 8.0及以上版本中,JSON_TABLE函数可以将JSON数据转换为关系型表结构,结合子查询和嵌套使用的方式,能够高效处理多层嵌套的复杂JSON数据,满足各类业务场景的数据提取需求。

怎么在MySQL中利用子查询实现复杂的JSON数据提取_通过JSON_TABLE嵌套

JSON_TABLE基本用法回顾

JSON_TABLE的作用是将JSON数组或对象展开成多行多列的关系型数据,基本语法结构如下:

-- 基础JSON_TABLE语法示例
SELECT *
FROM JSON_TABLE(
    '[{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]',  -- JSON数据源
    "$[*]" COLUMNS (  -- 路径表达式,[*]表示遍历数组所有元素
        id INT PATH "$.id",  -- 提取id字段,映射为INT类型列
        name VARCHAR(20) PATH "$.name"  -- 提取name字段,映射为VARCHAR类型列
    )
) AS jt;

上述语句会将传入的JSON数组转换为两行两列的关系表,每一行对应一个JSON对象,列对应提取的字段。

子查询结合JSON_TABLE实现嵌套提取

当JSON数据存储在表的字段中,且结构存在多层嵌套时,可以先通过子查询获取目标JSON数据,再嵌套使用JSON_TABLE提取内容。假设存在用户表user_info,其中ext_data字段存储用户的扩展JSON信息,结构如下:

-- 创建测试表并插入数据
CREATE TABLE user_info (
    user_id INT PRIMARY KEY,
    ext_data JSON
);

INSERT INTO user_info VALUES
(1, '{"hobbies": [{"type": "运动", "items": ["跑步", "游泳"]}, {"type": "阅读", "items": ["小说", "散文"]}], "address": "北京"}'),
(2, '{"hobbies": [{"type": "音乐", "items": ["吉他", "钢琴"]}], "address": "上海"}');

第一步:子查询提取原始JSON数据

首先通过子查询筛选出需要的用户JSON数据,避免全表扫描带来的性能损耗:

-- 子查询获取目标用户的ext_data
SELECT ext_data
FROM user_info
WHERE user_id = 1;

第二步:嵌套JSON_TABLE提取多层数据

上述子查询得到的ext_data中,hobbies是数组,每个数组元素下的items也是数组,需要嵌套使用JSON_TABLE逐层提取:

-- 子查询结合嵌套JSON_TABLE提取所有爱好明细
SELECT 
    jt1.type AS hobby_type,  -- 第一层提取的爱好类型
    jt2.item AS hobby_item   -- 第二层提取的爱好具体项
FROM (
    -- 子查询:获取用户1的扩展数据
    SELECT ext_data
    FROM user_info
    WHERE user_id = 1
) AS sub
-- 第一层JSON_TABLE:提取hobbies数组的每个元素
CROSS JOIN JSON_TABLE(
    sub.ext_data,
    "$.hobbies[*]" COLUMNS (
        type VARCHAR(10) PATH "$.type",
        items_json JSON PATH "$.items"  -- 保留items数组用于第二层提取
    )
) AS jt1
-- 第二层JSON_TABLE:提取items数组的每个元素
CROSS JOIN JSON_TABLE(
    jt1.items_json,
    "$[*]" COLUMNS (
        item VARCHAR(10) PATH "$"  -- 提取数组中的每个字符串元素
    )
) AS jt2;

执行上述语句后,会得到如下结果:

hobby_typehobby_item
运动跑步
运动游泳
阅读小说
阅读散文

复杂场景下的优化建议

  • 子查询中尽量添加合理的WHERE条件,减少参与JSON_TABLE转换的数据量,提升查询性能
  • 嵌套JSON_TABLE的层数不宜过多,超过3层时建议先通过临时表存储中间结果,再进行后续提取
  • 对频繁进行JSON提取的字段,可以考虑增加虚拟列并创建索引,降低JSON解析的开销

常见问题说明

如果JSON路径不存在对应字段,JSON_TABLE会返回NULL值,若需要过滤空值,可以在外层查询添加WHERE条件过滤

当JSON数据结构不固定时,可以先通过JSON_TYPE()函数判断字段类型,再动态调整JSON_TABLE的路径表达式,避免查询报错。

MySQLJSON_TABLE子查询JSON数据提取修改时间:2026-07-03 19:48:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。