mysql数据库中查询json的技巧大全

 更新时间:2025年02月12日 10:01:59   作者:钱多多_qdd  
这篇文章主要介绍了MySQL中JSON数据类型的各种函数,包括JSON_EXTRACT、JSON_UNQUOTE、JSON_SEARCH、JSON_SET、JSON_CONTAINS、JSON_REMOVE和JSON_REPLACE等,涵盖了JSON数据的提取、更新、删除和查询等功能,需要的朋友可以参考下

前置工作

CREATE TABLE `mk_task_record` (
  `task_id` int NOT NULL AUTO_INCREMENT,
  `task_name` varchar(50) DEFAULT NULL,
  `result_json` json DEFAULT NULL,
  `result_str` longtext,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`task_id`),
  KEY `task_name` (`task_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入数据:

插入带转义符的json:

INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (1, '哈哈1', '{\"age\": 22, \"name\": \"李四\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n  \"name\": \"李四\",\r\n  \"age\": 22,\r\n  \"major\": \"计算机科学\",\r\n  \"university\": \"清华大学\",\r\n  \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');

INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (2, '哈哈2', '{\"age\": 22, \"name\": \"张三\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n  \"name\": \"张三\",\r\n  \"age\": 22,\r\n  \"major\": \"计算机科学\",\r\n  \"university\": \"清华大学\",\r\n  \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');

插入不带转义符的json:

INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈3', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈4', '{"name": "赵六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}','{"name": "赵六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
  • result_json是json格式;
  • result_result是longtext格式;

经过实际测试,json、varchar、text类型的json格式都可以使用以下的函数,且效果相同。

一、JSON_EXTRACT 提取指定数据

1.1 提取简单值

SELECT JSON_EXTRACT(result_str,'$.name') from mk_task_record;
SELECT JSON_EXTRACT(result_json,'$.name') from mk_task_record;
  • json类型:

  • text类型

    结果也带引号;

如何去掉引号呢?

——查看【四、JSON_UNQUOTE 取消双引号】

  • 作条件查询
select *from mk_task_record where json_extract(result_str,'$.name') ='张三';
select *from mk_task_record where json_extract(result_json,'$.name') ='张三';

两条sql返回的都一样:

https://www.jb51.net/database/3356367c4.htm

二、字段->'$.json属性’进行查询条件,以及数据反显

select result_json->'$.name' from mk_task_record;

作为查询条件,不用转移双引号。

三、JSON_UNQUOTE 取消双引号

JSON_UNQUOTE() 函数取消双引号引用 JSON 值,并将结果作为字符串返回。

3.1 语法:

JSON_UNQUOTE(json_val)

参数说明:

json_val:必需的。一个字符串。

返回值:

取消双引号引用 JSON 值

返回NULL情况:参数为 NULL。

报错情况:不是有效的 JSON 字符串文本。能够识别下表中的转义字符:

  • ":双引号 "
  • \b:退格字符
  • \f:换页符
  • \n:换行符
  • \r:回车符
  • \t:制表符
  • \:反斜杠
  • \uXXXX:Unicode 值 XXXX 的 UTF-8 字节

3.2 示例:

SELECT JSON_UNQUOTE(JSON_EXTRACT(result_json,'$.name')) from mk_task_record;

五、JSON_SEARCH 查找

JSON_SEARCH() 函数返回一个给定字符串在一个 JSON 文档中的路径。

5.1 语法:

JSON_SEARCH(json, one_or_all, search_str)
JSON_SEARCH(json, one_or_all, search_str, escape_char)
JSON_SEARCH(json, one_or_all, search_str, escape_char, path)

参数说明:

  • on:必需的。一个 JSON 文档。
  • one_or_all:必需的。可用值:‘one’, ‘all’。
  • 规则如下:‘one’:返回第一个匹配的路径。‘all’:返回所有匹配的路径。所有的路径会包装在一个数组内返回。
  • search_str:必需的。被搜索的字符串。 您可以在 search_str 参数中使用 % 和 _ 通配符,就像 LIKE 一样:% 匹配任意数量的任意字符。_ 匹配一个任意字符。
  • escape_char:可选的。 如果 search_str 中包含 % 和 _,需要在他们之前添加转移字符。默认是 \。
  • path:可选的。只能在此路径下进行搜索。

返回值:一个路径字符串或者由多个路径组成的数组。返回 NULL情况:未搜索到指定的字符串。JSON 文档中不存在指定的 path。任意一个参数为 NULL。

报错情况:json 不是有效的 JSON 文档。path 不是有效的路径表达式。

5.2 示例:

select *from mk_task_record where  JSON_SEARCH(result_json,'one','张三');

六、JSON_SET 插入或更新数据

JSON_SET() 函数在一个 JSON 文档中插入或更新数据并返回新的 JSON 文档。它相当于是 JSON_INSERT() 和 JSON_REPLACE() 的组合。

6.1 语法:

JSON_SET(json, path, value[, path2, value2] ...)

参数说明:

  • json:必需的。被修改的 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
  • value:必需的。要设置的数据。

插入或更新数据并返回新的 JSON 文档。规则如下:

  • 存在路径:更新。
  • 不存在路径:添加。
  • 若value 为字符串:直接插入。
  • 返回 NULL情况:JSON 文档或者路径为 NULL。

报错情况:json 不是有效的 JSON 文档。

path 不是有效的路径表达式或者其中包含 * 或 **。

6.2 示例:

UPDATE mk_task_record SET result_str = JSON_SET(result_str, '$.name', '王麻子', '$.age', '36')  where task_id =1;

七、JSON_CONTAINS 判断是否包含

JSON_CONTAINS() 函数检查一个 JSON 文档中是否包含另一个 JSON 文档。

7.1 语法:

JSON_CONTAINS(target_json, candidate_json)
JSON_CONTAINS(target_json, candidate_json, path)

参数说明:

  • target_json必需的。一个 JSON 文档。
  • candidate_json:必需的。被包含的 JSON 文档。
  • path:可选的。一个路径表达式。
  • 返回值:

包含:返回1。
不包含:返回0。
返回 NULL情况:JSON 文档中不存在指定的路径。
任意一个参数为 NULL。

报错情况:
json 不是有效的 JSON 文档。path 不是有效的路径表达式。

示例:

SELECT * FROM mk_task_record WHERE JSON_CONTAINS(result_json, '"张三"','$.name');

注意:"张三"有双引号一定加,否则报错:

八、JSON_REMOVE 删除指定数据

JSON_REMOVE() 函数从一个 JSON 文档中删除由路径指定的数据并返回修改后的 JSON 文档。

8.1 语法:

JSON_REMOVE(json, path[, path] ...)

参数说明:

  • json:必需的。一个 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。

返回值:删除后的JSON文档。

8.2 示例:

select JSON_REMOVE(result_str,'$.major') from mk_task_record where task_id =1;

九、JSON_REPLACE 替换数据

JSON_REPLACE() 函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档

9.1 语法:

JSON_REPLACE(json, path, value[, path2, value2] ...)

参数说明:

  • json:必需的。被修改的 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
  • value:必需的。新的数据。
  • 返回值:替换后的JSON文档。回 NULL情况:JSON 文档或者路径为 NULL。

报错情况:
json 不是有效的 JSON 文档。path 不是有效的路径表达式或者其中包含 * 或 **。

9.2 示例:

select JSON_REPLACE(result_str,'$.university','复旦大学') from mk_task_record where task_id =1;

拓展:

https://www.jb51.net/database/3356414s9.htm

总结

到此这篇关于mysql数据库中查询json技巧大全的文章就介绍到这了,更多相关mysql查询json技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL慢查询日志的基本使用教程

    MySQL慢查询日志的基本使用教程

    MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。这篇文章主要给大家介绍了关于MySQL慢查询日志的基本使用的相关资料,需要的朋友可以参考下
    2019-01-01
  • MySQL表添加某一列和删除某一列的方法

    MySQL表添加某一列和删除某一列的方法

    MySQL是一种广泛使用的关系型数据库管理系统,它是一种开源的软件,由瑞典的MySQL AB公司开发的,这篇文章主要介绍了关于MySQL表添加某一列和删除某一列的sql语句,需要的朋友可以参考下
    2023-06-06
  • mysql-5.5.28源码安装过程中错误总结

    mysql-5.5.28源码安装过程中错误总结

    介绍一下关于mysql-5.5.28源码安装过程中几大错误总结,希望此文章对各位同学有所帮助。
    2013-10-10
  • 你知道哪几种MYSQL的连接查询

    你知道哪几种MYSQL的连接查询

    连接(join)查询是将两个查询的结果以“横向对接”的方式合并起来的结果,这篇文章主要给大家介绍了关于MYSQL连接查询的相关资料,需要的朋友可以参考下
    2021-06-06
  • Xampp中mysql无法启动问题的解决方法

    Xampp中mysql无法启动问题的解决方法

    最近有朋友反映遇到了xampp的mysql启动不了这种情况,该怎么办呢,所以下面这篇文章主要给大家介绍了关于Xampp中mysql无法启动问题的解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • IDEA找不到Database的完美解决方法

    IDEA找不到Database的完美解决方法

    IntelliJ IDEA中可以用database来连接数据库,但也会经常遇到问题,下面这篇文章主要给大家介绍了关于IDEA找不到Database的完美解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 安装MySQL后,需要调整的10个性能配置项

    安装MySQL后,需要调整的10个性能配置项

    这篇文章主要介绍了安装MySQL后,需要调整的10个性能配置项,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL FLOAT不准问题解析

    MySQL FLOAT不准问题解析

    在数据库处理中,使用FLOAT类型存储浮点数时,由于二进制表示的限制,会导致精度损失,解决方法包括使用DOUBLE或DECIMAL类型来提高精度,或避免使用浮点数进行精确计算,感兴趣的可以了解一下
    2024-09-09
  • 浅析MySQL 备份与恢复

    浅析MySQL 备份与恢复

    这篇文章主要介绍了MySQL 备份与恢复的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • mysql 5.7.20\5.7.21 免安装版安装配置教程

    mysql 5.7.20\5.7.21 免安装版安装配置教程

    这篇文章主要为大家详细介绍了mysql5.7.20和mysql5.7.21免安装版安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论