0

0

SQL JSON_TABLE 与结构化查询应用

冷炫風刃

冷炫風刃

发布时间:2026-02-16 12:29:03

|

882人浏览过

|

来源于php中文网

原创

json_table用于将json数组展开为关系表,适用于对象数组场景,不适用于嵌套过深、单字段提取或json校验;需注意path路径正确性、驱动表顺序、mysql版本及utf8mb4字符集兼容性。

sql json_table 与结构化查询应用

JSON_TABLE 用在哪?不是所有 JSON 都适合它

JSON_TABLE 是 MySQL 8.0.4+ 提供的函数,核心作用是把一行 JSON 字符串「展开」成多行关系表。它不处理嵌套太深的结构,也不适合做 JSON 校验或提取单个字段——那是 JSON_EXTRACT-> 操作符的事。

常见错误现象:把 {"name": "Alice", "tags": ["a","b"]} 直接喂给 JSON_TABLE 却没指定 tags 是数组路径,结果返回空行。

使用场景很明确:

  • JSON 列里存的是「对象数组」,比如 [{"id":1,"val":"x"},{"id":2,"val":"y"}]
  • 你想把它当普通表 JOIN、WHERE、GROUP BY
  • 数据来自外部系统(如日志、API 响应),且格式相对稳定

性能影响明显:每次调用 JSON_TABLE 都要解析整段 JSON,如果源字段没建函数索引,又在 WHERE 条件里反复用,查询会变慢。

SELECT jt.id, jt.val 
FROM orders o,
JSON_TABLE(o.items, '$[*]' COLUMNS (
  id INT PATH '$.id',
  val VARCHAR(20) PATH '$.val'
)) AS jt
WHERE o.status = 'shipped';

PATH 表达式写错,结果就全空

JSON_TABLECOLUMNS 子句里,每个 PATH 必须严格匹配 JSON 结构层级。路径错一级、少个 [*]、多一层 $,整列就 NULL。

容易踩的坑:

  • '$.items[<em>]'</em> 写成 '$items[]'(漏了点)
  • 数组路径用了 '$.list' 但实际是 {"list": [{"a":1}]},得写成 '$.list[*]'
  • 路径里混用双引号和单引号导致语法报错,MySQL 要求统一用单引号包住整个 PATH 字符串

参数差异要注意:PATH 后面可以跟 EXISTSFOR ORDINALITY,但别误以为 FOR ORDINALITY 能排序——它只加一列序号,不改变输出顺序。

HiShop网店代理分销系统
HiShop网店代理分销系统

Hishop.5.2.BETA2版主要更新: [修改] 进一步优化了首页打开速度 [修改] 美化了默认模板 [修改] 优化系统架构,程序标签及SQL查询效率,访问系统页面的速度大大提高 [修改] 采用了HTML模板机制,实现了前台模板可视化编辑,降低模板制作与修改的难度. [修改] 全新更换前后台AJAX技术框架,提升了用户操作体验. 店铺管理 [新增] 整合TQ在线客服 [修改] 后台广告位增加

下载
JSON_TABLE(data, '$' COLUMNS (
  name VARCHAR(50) PATH '$.user.name',
  tags JSON PATH '$.user.tags',  -- 保留原 JSON 片段
  has_tags FOR ORDINALITY  -- 这列值恒为 1,不是索引
))

JOIN 时别忘了显式指定驱动表

JSON_TABLE 本身不支持直接 LEFT JOIN,只能靠逗号语法或 LATERAL(MySQL 8.0.14+ 支持)。但即使写了 LATERAL,优化器仍可能选错驱动表,尤其当 JSON 字段所在表数据量大、又没合适索引时。

常见错误现象:本想以主表 orders 为驱动,逐行展开其 items,结果 MySQL 先扫了 JSON_TABLE 输出的临时结果集,再反向匹配,内存暴涨甚至 OOM。

实操建议:

  • 确保主表有高效过滤条件(如 WHERE created_at > '2024-01-01')并已建索引
  • FROM 子句中把主表放前面,JSON_TABLE 放后面,避免优化器乱换顺序
  • 如果必须 LEFT JOIN(即某行 JSON 为空也要保留),改用 UNION ALL + IS NULL 模拟,虽然啰嗦但可控
SELECT o.id, jt.item_id, jt.qty
FROM orders o
LATERAL JSON_TABLE(o.items, '$[*]' COLUMNS (
  item_id INT PATH '$.id',
  qty INT PATH '$.quantity'
)) AS jt
WHERE o.status = 'confirmed';

MySQL 版本和字符集不兼容,解析直接失败

JSON_TABLE 在 MySQL 8.0.4 引入,但早期小版本(如 8.0.4–8.0.12)对中文、emoji、深层嵌套的支持不稳定。最常遇到的是:JSON 字符串含 UTF8MB4 字符,而连接字符集设为 utf8(非 utf8mb4),解析后字段全变成 ??? 或报错 Invalid utf8mb4 character string

兼容性要点:

  • 客户端连接必须声明 charset=utf8mb4
  • JSON 列定义推荐用 JSON 类型,而非 TEXT;后者虽能存,但 JSON_TABLE 解析时可能因隐式转换出错
  • 不要用 JSON_VALID() 替代 JSON_TABLE 的容错——前者只判合法,后者在路径不匹配时静默返回 NULL,不会中断查询

容易被忽略的地方是:哪怕你确认 JSON 格式正确、路径也没错,只要客户端连接的 character_set_clientlatin1JSON_TABLE 就可能把中文键名识别失败,整个 COLUMNS 映射失效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

965

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

376

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1676

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

370

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1252

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

584

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

435

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号