Mysql使用函数json_extract处理Json类型数据的方法实例

 更新时间:2022年09月05日 09:04:21   作者:靖节先生  
在日常业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,下面这篇文章主要给大家介绍了关于Mysql使用函数json_extract处理Json类型数据的相关资料,需要的朋友可以参考下

1. 需求概述

业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,查询的时候有时json数据较大,每次全部取出再去解析查询效率较低,也比较麻烦,则Mysql5.7版本提供提供函数json_extract,可以通过key查询value值,比较方便。

2. json_extract简介

2.1 函数简介

Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。

2.2 使用方式

数据存储的数据是json字符串(类型是vachar)。

想要查询出来json中某个字段的值,用到方法是:JSON_EXTRACT()。

语法:

JSON_EXTRACT(json_doc, path[, path] …)

实际用法:

如果json字符串不是数组,则直接使用$.字段名即可

2.3 注意事项

JSON_EXTRACT性能验证 , 通过查看执行计划,验证全部都是全表扫描。

使用场景:数据量不大json字符串较大则可以采用,数据量较大不建议使用。

3. 实现验证

3.1 建表查询

-- 创建测试表
CREATE TABLE `tab_json` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `data` json DEFAULT NULL COMMENT 'json字符串',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 新增数据
-- {"Tel": "132223232444", "name": "david", "address": "Beijing"}
-- {"Tel": "13390989765", "name": "Mike", "address": "Guangzhou"}
INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (1, '{\"Tel\": \"132223232444\", \"name\": \"david\", \"address\": \"Beijing\"}');
INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (2, '{\"Tel\": \"13390989765\", \"name\": \"Mike\", \"address\": \"Guangzhou\"}');
INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (3, '{"success": true,"code": "0","message": "","data": {"name": "jerry","age": "18","sex": "男"}}');
INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (4, '{"success": true,"code": "1","message": "","data": {"name": "tome","age": "30","sex": "女"}}');

-- 查询
select * from tab_json;

-- json_extract
select json_extract('{"name":"Zhaim","tel":"13240133388"}',"$.tel");
select json_extract('{"name":"Zhaim","tel":"13240133388"}',"$.name");

-- 对tab_json表使用json_extract函数
select json_extract(data,'$.name') from tab_json;

#如果查询没有的key,那么是可以查询,不过返回的是NULL.
select json_extract(data,'$.name'),json_extract(data,'$.Tel') from tab_json;  
select json_extract(data,'$.name'),json_extract(data,'$.tel') from tab_json;  
select json_extract(data,'$.name'),json_extract(data,'$.address') from tab_json;

-- 条件查询
select json_extract(data,'$.name'),json_extract(data,'$.Tel') from tab_json where json_extract(data,'$.name') = 'Mike';  

-- 嵌套json查询
select * from tab_json where json_extract(data,'$.success') = true;  
select json_extract(data,'$.data') from tab_json where json_extract(data,'$.success') = true;  
-- 查询data对应json中key为name的值
select json_extract( json_extract(data,'$.data'),'$.name') from tab_json where json_extract(data,'$.code') = "1";  
select json_extract( json_extract(data,'$.data'),'$.name'),json_extract( json_extract(data,'$.data'),'$.age') from tab_json where json_extract(data,'$.code') = "0";  

-- 性能验证 , 通过验证全部都是全表扫描,使用场景:数据量不大json字符串较大则可以采用,数据量较大不建议使用。
explain select * from tab_json where json_extract(data,'$.success') = true;  
explain select json_extract(data,'$.data') from tab_json where json_extract(data,'$.success') = true;  
-- 查询data对应json中key为name的值
explain select json_extract( json_extract(data,'$.data'),'$.name') from tab_json where json_extract(data,'$.code') = "1";  
explain select json_extract( json_extract(data,'$.data'),'$.name'),json_extract( json_extract(data,'$.data'),'$.age') from tab_json where json_extract(data,'$.code') = "0"; 

3.2 查询结果

总结 

到此这篇关于Mysql使用函数json_extract处理Json类型数据的文章就介绍到这了,更多相关Mysql用函数json_extract处理Json内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL Order By语法介绍

    MySQL Order By语法介绍

    今天在使用ORDER BY的过程中出现了一点问题,发现之前对ORDER BY理解是错误的
    2012-07-07
  • mysql命令行脚本执行操作示例

    mysql命令行脚本执行操作示例

    这篇文章主要介绍了mysql命令行脚本执行操作,结合实例形式分析了MySQL命令行操作相关的登入登出、创建删除、增删改查等操作技巧,需要的朋友可以参考下
    2019-11-11
  • Mysql索引详细介绍

    Mysql索引详细介绍

    这篇文章主要介绍了Mysql索引详细介绍,本文讲解了Mysql索引简介、设计索引的原则、如何使用索引等内容,需要的朋友可以参考下
    2014-07-07
  • My Sql 1067错误与编码问题的解决方案

    My Sql 1067错误与编码问题的解决方案

    My Sql 大部分都是用绿色版(解压版) 然后注册服务简单方便,但是配置文件也很让人纠结,下面小编给大家带来了My Sql 1067错误与编码问题的解决方案,感兴趣的朋友参考下吧
    2016-11-11
  • centos 6下安装innodb_ruby

    centos 6下安装innodb_ruby

    innodb_ruby 是使用 Ruby 编写的 InnoDB 文件格式解析器。innodb_ruby 的目的是暴露一些其他隐藏的 InnoDB 原理。这些代码并不适合生产环境使用。
    2017-01-01
  • SQL模糊查询报:ORA-00909:参数个数无效问题的解决

    SQL模糊查询报:ORA-00909:参数个数无效问题的解决

    这篇文章主要介绍了SQL模糊查询报:ORA-00909:参数个数无效问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mysql的MVCC多版本并发控制的实现

    mysql的MVCC多版本并发控制的实现

    这篇文章主要介绍了mysql的MVCC多版本并发控制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MySQL用户权限管理详解

    MySQL用户权限管理详解

    这篇文章主要为大家详细介绍了MySQL用户权限管理的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • k8s搭建mysql集群实现主从复制的方法步骤

    k8s搭建mysql集群实现主从复制的方法步骤

    本文是基于已有k8s环境下,介绍在k8s环境中部署mysql主从集群的实现步骤,对mysql学习有一定的帮助,感兴趣的可以学习一下
    2023-01-01
  • MYSQL8.0.13免安装版配置教程实例详解

    MYSQL8.0.13免安装版配置教程实例详解

    这篇文章主要介绍了MYSQL8.0.13免安装版 配置教程,本文是以8.0为例,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-12-12

最新评论