MySQL中的json处理相关方法详解

 更新时间:2025年10月21日 09:31:30   投稿:mrr  
在MySQL中,这些JSON函数用于处理JSON类型的数据,方便对JSON数据进行提取、转换和聚合等操作,本文给大家介绍MySQL的json处理相关方法,感兴趣的朋友跟随小编一起看看吧

起因:在使用tidb作为检查点的存储模块时,想着tidb兼容mysql,于是借用的langgraph-checkpoint-mysql插件来实现tidb。但在验证过程中发现并不如此,mysql很多处理json的语法tidb无法使用。下面介绍这些语法的功能,下一篇会介绍到底哪里不兼容。
json_table,json_unquote,json_extract,json_keys,json_arrayagg,json_array

在 MySQL 中,这些 JSON 函数用于处理 JSON 类型的数据,方便对 JSON 数据进行提取、转换和聚合等操作。

JSON_TABLE

作用:将 JSON 数据转换为关系表的形式,使得可以像查询普通表一样查询 JSON 数据中的元素,方便进行复杂的查询和分析。

案例:假设有一个 students 表,其中 courses 字段是 JSON 类型,存储了学生所选课程及其成绩。

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    courses JSON
);
INSERT INTO students (id, name, courses) VALUES
(1, 'Alice', '[{"course": "Math", "score": 90}, {"course": "English", "score": 85}]'),
(2, 'Bob', '[{"course": "Math", "score": 80}, {"course": "English", "score": 88}]');
-- 使用 JSON_TABLE 展开 courses 字段
SELECT 
    s.id,
    s.name,
    jt.course,
    jt.score
FROM 
    students s,
    JSON_TABLE(
        s.courses,
        '$[*]' COLUMNS (
            course VARCHAR(50) PATH '$.course',
            score INT PATH '$.score'
        )
    ) AS jt;

查询结果:

idnamecoursescore
1AliceMath90
1AliceEnglish85
2BobMath80
2BobEnglish88
JSON_TABLE(
  json_data,  -- 输入的 JSON 数据(可以是字段名、JSON 字符串或表达式)
  row_path_expression  -- 行路径表达式,指定从 JSON 中提取“行”的范围
  COLUMNS (
    -- 定义输出表的列结构,每个列包含:列名、数据类型、JSON 路径
    column1 data_type PATH 'json_path1',
    column2 data_type PATH 'json_path2',
    ...
  )
) AS table_alias  -- 为转换后的表指定别名

row_path_expression:行路径表达式

  • 用 JSON 路径语法指定从 JSON 中哪些部分提取 “行”(每个匹配的元素会成为表中的一行)。
  • 常用语法:
    • $[*]:匹配 JSON 数组中的所有元素(每个元素作为一行)。
    • $.obj[*]:匹配 JSON 对象中 obj 字段对应的数组的所有元素。
  • 示例:'$[*]'(解析 JSON 数组的所有元素为行)。

COLUMNS (...):定义输出表的列结构

用于指定转换后的关系表包含哪些列,以及每个列的值从 JSON 中的哪个位置提取。每个列的定义格式为:列名 数据类型 PATH 'JSON路径'

JSON_UNQUOTE 和JSON_EXTRACT

JSON_UNQUOTE

作用:移除 JSON 字符串中的引号,将 JSON 格式的字符串转换为普通字符串。

案例:假设从 JSON 数据中提取出来的某个值是带引号的字符串,想要得到不带引号的内容时使用。

JSON_EXTRACT

作用:从 JSON 数据中提取指定路径的元素,可以是标量值(如字符串、数字等),也可以是 JSON 对象或数组。

案例:继续使用上述 students 表,查询学生 Alice 的数学成绩。

查询结果:

name
John
  1. SET @json_str = '{"name": "John"}';
  • 定义一个名为 @json_str 的用户变量,并赋值为 JSON 格式的字符串 {"name": "John"}
  • 这里的 JSON 字符串表示一个对象,包含一个键值对:"name" 对应的值是 "John"(注意 JSON 中字符串必须用双引号包裹)。
  1. SELECT JSON_UNQUOTE(JSON_EXTRACT(@json_str, '$.name')) AS name;

这是一个查询语句,包含两个嵌套的 JSON 函数:

(1)JSON_EXTRACT(@json_str, '$.name')

  • 作用:从 JSON 数据中提取指定路径的值。
  • @json_str 是要解析的 JSON 变量(即 {"name": "John"})。
  • '$.name' 是 JSON 路径,表示 “根节点下的 name 字段”($ 代表根节点)。
  • 执行结果:提取到的值是 "John"(带双引号的 JSON 字符串)。

(2)JSON_UNQUOTE(...)

  • 作用:移除 JSON 字符串外层的双引号,将其转换为普通字符串。
  • 接收 JSON_EXTRACT 的结果 "John" 作为参数,移除引号后得到 John

(3)AS name

  • 给查询结果的列起一个别名 name,方便阅读。

JSON_KEYS

作用:返回 JSON 对象中的所有键,以 JSON 数组的形式呈现。

案例:假设有一个存储用户信息的 JSON 数据,获取其中所有的键。

SET @user_info = '{"name": "Tom", "age": 25, "email": "tom@example.com"}';
SELECT JSON_KEYS(@user_info) AS keys;

查询结果:

keys
[“name”, “age”, “email”]

JSON_ARRAYAGG

作用:将一组值聚合为一个 JSON 数组,常用于分组查询中,将每组内的相关数据聚合成 JSON 数组形式。

案例:统计每个学生所选课程的名称,以 JSON 数组形式呈现。

SELECT 
    name,
    JSON_ARRAYAGG(course) AS courses
FROM 
    students s,
    JSON_TABLE(
        s.courses,
        '$[*]' COLUMNS (
            course VARCHAR(50) PATH '$.course'
        )
    ) AS jt
GROUP BY 
    name;

查询结果:

namecourses
Alice[“Math”, “English”]
Bob[“Math”, “English”]

JSON_ARRAY

作用:将一组值创建为一个 JSON 数组,它与 JSON_ARRAYAGG 的区别在于,JSON_ARRAY 不是聚合函数,是直接创建数组。

案例:创建一个包含多个字符串的 JSON 数组。

SELECT JSON_ARRAY('red', 'green', 'blue') AS colors;

查询结果:

colors
[“red”, “green”, “blue”]

到此这篇关于MySQL中的json处理相关方法详解的文章就介绍到这了,更多相关mysql json处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql截取的字符串函数substring_index的用法

    mysql截取的字符串函数substring_index的用法

    这篇文章主要介绍了mysql截取的字符串函数substring_index的用法,需要的朋友可以参考下
    2014-08-08
  • Mysql自增主键id不是以此逐级递增的处理

    Mysql自增主键id不是以此逐级递增的处理

    这篇文章主要介绍了Mysql自增主键id不是以此逐级递增的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MySQL主键与外键设计原则 + 实战案例解析

    MySQL主键与外键设计原则 + 实战案例解析

    这篇文章详细介绍了MySQL中的主键和外键,包括它们的基本概念、设计原则、应用场景以及实战案例,主键用于唯一标识表中的每一行记录,而外键用于建立和加强表之间的关联关系,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • navicat创建MySql定时任务的方法详解

    navicat创建MySql定时任务的方法详解

    这篇文章主要介绍了navicat创建MySql定时任务的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • MySQL数据库如何正确设置主键

    MySQL数据库如何正确设置主键

    主键是用于唯一标识数据库表中每一行数据的一列或一组列,主键可以确保数据的唯一性和完整性,这篇文章主要给大家介绍了关于MySQL数据库如何正确设置主键的相关资料,需要的朋友可以参考下
    2024-04-04
  • 关于mysql innodb count(*)速度慢的解决办法

    关于mysql innodb count(*)速度慢的解决办法

    innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据。而innodb必须全表扫描一次方能得到总的数量
    2012-12-12
  • MySQL8.0安装中遇到的3个小错误总结

    MySQL8.0安装中遇到的3个小错误总结

    这篇文章主要给大家总结介绍了关于MySQL8.0安装中遇到的3个小错误的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家学习或者使用mysql8.0具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Mysql主从同步如何重置

    Mysql主从同步如何重置

    在MySQL数据库运维中,遇到主从数据库数据不一致时需要进行同步重置,本文介绍了主从同步重置的具体步骤:首先对从库操作,包括停止slave、重置从库;其次对主库进行操作,包括重置主库同步设置、锁定主库;最后从库导入主库数据
    2024-10-10
  • MySQL触发器使用详解

    MySQL触发器使用详解

    本文主要详细介绍了mysql数据库的触发器的相关知识,非常的全面,有需要的小伙伴参考下吧。
    2015-01-01
  • Mysql查询优化的一些实用方法总结

    Mysql查询优化的一些实用方法总结

    对于MySQL查询语句来说,效率是最重要的,下面这篇文章主要给大家介绍了关于Mysql查询优化的一些实用方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论