mysql的jsonTable使用及说明

 更新时间:2026年01月04日 15:36:22   作者:jpq+  
MySQL 8.0引入JSON_TABLE函数,用于将JSON数据转换为关系表,便于查询,JSON_TABLE支持嵌套路径,解决复杂JSON嵌套数据转换问题,根据SQL标准,MySQL将带有表函数的连接视为使用LATERAL,8.0.14及以上版本LATERAL关键字隐式

JSON_TABLE 是 MySQL 8.0 中一个新的 JSON 函数。它也是一个表函数,返回值不是标量值而是结果集。

JSON_TABLE 将 JSON 文档(部分或全部)转换为关系表,以便您可以像使用普通表一样使用它。

JSON_TABLE 函数从一个指定的 JSON 文档中提取数据并返回一个具有指定列的关系表。可以像普通的表一样使用 JSON_TABLE () 返回的表。

json-table官方文档地址:

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和名称:

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 表中查询所有名称和id,进行查询(在 MySQL 中,JSON_TABLE 函数的 JSON 路径表达式可以使用 $ 符号来指定。

$[*] 表示提取 JSON 文档中的所有属性):

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

数据将如下:

NESTED PATH 嵌套路径

NESTED PATH为其所属的子句中的每个匹配项生成一组记录。可以解决复杂的json嵌套数据转为行。

添加一条数据:

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:

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

我们发现每次jsontable后依然会对应所在的ID,比如:

上面需求的a,b列的ID就是1而不是其他ID。这其实是遵从了sql标准。

横向派生表

根据SQL标准,MySQL总是将带有表函数(如JSON_TABLE())的连接视为使用LATERAL无论MySQL发布版本如何,都是如此,这就是为什么即使在8.0.14之前的MySQL版本中也可以加入此函数的原因。

在MySQL 8.0.14及更高版本中,LATERAL 关键字是隐式的,不允许在 JSON_TABLE() 之前使用。这也是根据SQL标准。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spark rdd转dataframe 写入mysql的实例讲解

    spark rdd转dataframe 写入mysql的实例讲解

    今天小编就为大家分享一篇spark rdd转dataframe 写入mysql的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • MYSQL数据表基本操作之创建+查看+修改+删除操作方法

    MYSQL数据表基本操作之创建+查看+修改+删除操作方法

    本文将介绍如何在MySQL数据库中进行数据表的创建、查看、修改和删除操作,并讨论一些常见的注意事项及防止误操作的策略,通过这些基础操作,您将能够更高效地进行数据库设计和管理工作,感兴趣的朋友一起看看吧
    2025-04-04
  • mysql字符串函数详细汇总

    mysql字符串函数详细汇总

    这篇文章主要介绍了mysql字符串函数详细汇总,字符串函数主要用来处理数据库中的字符串数据,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • 解决Navicat查询到的数据不能修改问题

    解决Navicat查询到的数据不能修改问题

    文章主要讨论了在Navicat中查询到的数据不能修改的几种可能原因,包括表是只读、权限不够、表没有设置主键以及使用了GROUP BY查询导致的数据不是原来表里的数据
    2025-11-11
  • Mysql5.5安装配置方法及中文乱码的快速解决方法

    Mysql5.5安装配置方法及中文乱码的快速解决方法

    这篇文章主要介绍了Mysql5.5安装配置方法以及mysql5.5中文乱码的快速解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • mysql 无限级分类实现思路

    mysql 无限级分类实现思路

    关于该问题,暂时自己还没有深入研究,在网上找到几种解决方案,各有优缺点。
    2011-08-08
  • mysql如何查询表中的字段数量

    mysql如何查询表中的字段数量

    这篇文章主要介绍了mysql如何查询表中的字段数量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql中find_in_set()函数用法及自定义增强函数

    mysql中find_in_set()函数用法及自定义增强函数

    MySQL 中的 FIND_IN_SET 函数用于在逗号分隔的字符串列表中查找指定字符串的位置,本文就来介绍一下mysql中find_in_set()函数用法及自定义增强函数
    2024-08-08
  • MySQL常用客户端工具的用途和详细说明

    MySQL常用客户端工具的用途和详细说明

    MySQL是一个广泛使用的开源关系数据库管理系统(RDBMS),它为开发者和数据库管理员提供了一套完整的客户端工具和功能,这篇文章主要介绍了MySQL常用客户端工具的用途和详细说明的相关资料,需要的朋友可以参考下
    2025-09-09
  • 详解mysql不等于null和等于null的写法

    详解mysql不等于null和等于null的写法

    这篇文章主要介绍了详解mysql不等于null和等于null的写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论