首页 > 数据库 >mysql的jsonTable使用及说明

mysql的jsonTable使用及说明

来源:互联网 2026-03-26 10:39:32

目录以下是jsontable的语法使用示例NESTED PATH 嵌套路径横向派生表总结JSON_TABLE 是 MySQL 8.0 中一个新的 JSON 函数。它也是一个表函数,返回值不是标量值而是结果集。JSON_TABLE 将 JSON 文档(部分或全部)转换为关系表,以便您可以像使用普通表一样使用它。JSON_TABLE 函数从一个指定的 JSON 文档中提取数据并返回一个具有指定列的关系表。可以像普通的表一样使用 JSON_TABLE () 返回的表。json-table官方文档地址:https

目录
  • 以下是jsontable的语法
  • 使用示例
  • NESTED PATH 嵌套路径
  • 横向派生表
  • 总结

想从JSON文档里直接提取表格数据来处理?MySQL 8.0引入的JSON_TABLE函数,正是为了解决这个痛点。它可不是返回简单的标量值,而是直接把JSON结构“翻译”成一个标准的结果集,让你能像操作普通表一样来查询JSON数据。

简单来说,JSON_TABLE的核心任务,就是从指定的JSON文档中提取信息,并根据你定义的列结构,返回一张关系型表格。这为复杂JSON数据的深度分析,打开了新的大门。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

官方文档永远是第一手资料,建议搭配阅读: https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html#function_json-table

以下是jsontable的语法

JSON_TABLE(
    expr,
    path COLUMNS (column_list)
)   [AS] alias

column_list:
    column[, column][, ...]

column:
    name FOR ORDINALITY
    |  name type PATH string path [on_empty] [on_error]
    |  name type EXISTS PATH string path
    |  NESTED [PATH] path COLUMNS (column_list)

on_empty:
    {NULL | DEFAULT json_string | ERROR} ON EMPTY

on_error:
    {NULL | DEFAULT json_string | ERROR} ON ERROR

语法看似复杂,但拆解开来,无非是定义数据源、提取路径和列映射这几个关键部分。

使用示例

光说不练假把式,咱们用一个具体案例来上手。先创建一个包含ID和JSON类型名称字段的表:

CREATE TABLE t1(
    id       varchar(32),
    name JSON
);

接着,插入几条测试数据:

INSERT INTO t1
VALUES (uuid_short(), json_array('John'));
INSERT INTO t1
VALUES (uuid_short(), json_array('toma','Smith'));
INSERT INTO t1
VALUES (uuid_short(), json_array('aa','bb','cc','tt'));

现在,我们的目标是把`t1`表中每条记录的`name`这个JSON数组打散,让每个数组元素和对应的`id`形成一行数据。这时,`JSON_TABLE`就派上用场了。这里用到的`$[*]`路径,表示提取JSON文档中的所有元素。

SELECT value,id
from t1
        ,
     JSON_TABLE(name, '$[*]' COLUMNS (
         value VARCHAR(255) PATH '$'
         )) AS jt

执行一下,数据就成了下面这个样子,数组被完美地“扁平化”了:

mysql的jsonTable使用及说明

NESTED PATH 嵌套路径

简单的数组扁平化还不够?面对嵌套更深的JSON结构,比如数组里套对象,对象里又套数组,怎么办?别急,`NESTED PATH`就是为这种复杂场景而生的。它会为父路径中匹配到的每一项,再生成一组子记录。

咱们再加一条更复杂的数据来试试:

INSERT INTO t1
VALUES ('1', json_array(json_object('a',1,'b',json_array(11,111)),
    json_object('a',2, 'b',json_array(22,222)),
    json_object('a',3)));

现在,使用`NESTED PATH`来同时提取对象中的`a`字段和嵌套数组`b`中的每一个元素:

SELECT jt.*
FROM t1,
     JSON_TABLE(
             name,
             '$[*]' COLUMNS (
                 a INT PATH '$.a',
                 NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$')
                 )
         ) AS jt
WHERE id = '1';

来看一下查询结果,你会发现,`b`数组中的每个值,都和其所属对象的`a`值正确关联了:

mysql的jsonTable使用及说明

这里有个细节值得注意:经过`JSON_TABLE`转换后的所有列,都天然关联着原始行的ID。比如上面结果中`a`和`b`列的ID都是‘1’,而不会与其他行的ID混淆。这并非是MySQL的特殊处理,而是遵循了SQL的标准规范。

可以看下面这张图,关联关系一目了然:

mysql的jsonTable使用及说明

横向派生表

说到SQL标准,就不得不提一下`JSON_TABLE`的连接行为。根据SQL标准,任何与表函数(如`JSON_TABLE()`)的连接,都被视为使用了`LATERAL`连接。这意味着,表函数的计算会依赖于它左侧表中的每一行。

实际上,在MySQL 8.0.14及之后的版本中,`LATERAL`关键字对于`JSON_TABLE()`是隐式存在的,甚至不允许显式写出。这也是为了严格符合SQL标准。所以,无论你在哪个兼容的MySQL版本中使用它,其横向连接的语义都是确定无疑的。

总结

总结一下,`JSON_TABLE`函数是MySQL处理JSON数据的一把利器,尤其擅长将复杂、嵌套的JSON结构转换为规整的二维表格,极大地便利了后续的统计分析。从简单的数组展开到复杂的多层嵌套解析,结合`NESTED PATH`都能应对自如。理解其作为“横向派生表”的工作机制,有助于我们更准确地预测和编写关联查询。

希望以上的梳理和示例能为大家在实际工作中使用JSON_TABLE带来一些清晰的思路。如果遇到更复杂的场景,多动手试验,结合官方文档,往往就能找到解决方案。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。