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标准。

总结

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

相关文章

  • Mysql中的CHECK约束特性详解

    Mysql中的CHECK约束特性详解

    这篇文章主要介绍了Mysql中的CHECK约束特性详解的相关资料,讲解的十分浅显易懂,这里推荐给大家,需要的朋友可以参考下
    2022-08-08
  • 浅谈sql数据库去重

    浅谈sql数据库去重

    关于sql去重,我简单谈一下自己的理解和经验,如果各位有建议或有不明白的欢迎多多指出。
    2014-08-08
  • Mysqlslap MySQL压力测试工具 简单教程

    Mysqlslap MySQL压力测试工具 简单教程

    Mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具。通过模拟多个并发客户端访问MySQL来执行压力测试,同时详细的提供了“高负荷攻击MySQL”的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别
    2011-10-10
  • 如何配置全世界最小的 MySQL 服务器

    如何配置全世界最小的 MySQL 服务器

    Intel Edison 是一个小巧的计算机基于 22 nm 的 Silvermont 双核 Intel Atom CPU 主频 500MHz运行 Linux (叫做 Yocto 的基于 Ubuntu 的发布版)。为了对 Edison 进行编程,我们需要一块接口板。可以选择的板子包括兼容Arduino的接口板 (包含了 SD 卡) 还有 Intel 接口板。
    2016-04-04
  • mysql 5.7.13 安装配置方法图文教程(win10)

    mysql 5.7.13 安装配置方法图文教程(win10)

    这篇文章主要为大家分享了mysql 5.7.13 安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-06-06
  • mysql 8.0 找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

    mysql 8.0 找不到my.ini配置文件以及报sql_mode=only_full_group

    MySQL5.7.5及以上版本启用ONLY_FULL_GROUP_BYSQL模式可能导致的问题,本文就来介绍一下找不到my.ini配置文件的解决方法,感兴趣的可以了解一下
    2024-08-08
  • mysql数据库忘记管理员密码的解决方法

    mysql数据库忘记管理员密码的解决方法

    我们在Windows操作系统下编程会使用到MySQL数据库。但是有时,我们会忘记数据库的登录密码?当我们忘记了登录密码,无法进入mysql时,该怎么办呢?这里我们提供mysql的登录秘密的修改
    2018-02-02
  • mysql数据库中1045错误的解决方法

    mysql数据库中1045错误的解决方法

    这篇文章主要为大家详细介绍了MySQL数据库中1045错误的解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • mysql命令导出表结构和数据的操作方法

    mysql命令导出表结构和数据的操作方法

    在日常使用中,我们经常需要对数据库进行备份和复制,因此必须了解如何导出表结构和表数据,以下是使用MySQL命令导出表结构和表数据的方法,感兴趣的朋友一起看看吧
    2023-11-11
  • MySQL数据库减少磁盘I/O的深入拆解

    MySQL数据库减少磁盘I/O的深入拆解

    为了减少磁盘I/O操作,MySQL使用了一些技术来提高性能,这篇文章主要介绍了MySQL数据库减少磁盘I/O的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-04-04

最新评论