Mysql使用函数json_extract处理Json类型数据_json extract 语法-程序员宅基地

技术标签: 数据存储  mysql查询json  JSON_EXTRACT  

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 查询结果

在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37583655/article/details/119889086

智能推荐

洛谷 P1879 玉米田(状压DP入门题)-程序员宅基地

文章浏览阅读98次。传送门https://www.cnblogs.com/violet-acmer/p/9852294.html题解:  相关变量解释:1 int M,N;2 int plant[maxn][maxn];//草场情况3 struct Node4 {5 int status;//状态6 int res;//方案7 Node(int..._玉米田 编程题

关于blob加密视频的基于m3u8和ts文件下载转MP4视频的python爬虫实现_基于blob的视频加密 切片-程序员宅基地

文章浏览阅读3.9k次。关于blob加密视频的基于m3u8和ts文件下载转MP4视频的python爬虫实现首先谈一下这篇文章主要的爬虫对象,基本上都是一些视频网站(一些大厂会有自己独特的编码风格需要自行破解加密格式,所以很难实现,所以这篇文章主要针对于一些小网站)。下面先说一下blob加密的实现,可以参考这篇博客(https://blog.csdn.net/xingyun89114/article/details/80699527)总结来说呢,其实就是HTTP请求后的数据做blob加密,上篇博客我们也可以在开发者模式中的ne_基于blob的视频加密 切片

用数据说话,深度剖析嵌入式开发前景及国内发展状_中国有多少在岗嵌入式员工-程序员宅基地

文章浏览阅读1.1k次。权威部门统计,我国嵌入式人才缺口每年50万人左右。根据前程无忧网发布的调查报告,嵌入式软件开发是未来几年最热门和最受欢迎的职业之一,具有10年工作经验的高级嵌入式工程师年薪在30万元左右。即使是初级的嵌入式软件开发人员,平均月薪也达到3000-5000元,中高级的嵌入式工程师月薪平均超过10000元。做软件实际上有高下之分,开发语言从机器语言、汇编到C、C++,再到红透半边天的Java、C#等,该学哪种呢?为什么有些开发者工资低,而有些开发者千金难求?为什么3年的Java高级程序员薪水仅仅8k-1..._中国有多少在岗嵌入式员工

【附安装包】Java/JDK介绍、下载、安装、配置与使用(保姆级教程)_java jdk下载-程序员宅基地

文章浏览阅读2.5k次,点赞4次,收藏10次。精炼、易懂的JDK安装教程,Java初学者的福音!_java jdk下载

python一级证书有必要考吗,小学生python考级有用吗_少儿python考级能不考一级-程序员宅基地

文章浏览阅读1k次,点赞13次,收藏24次。大家好,小编来为大家解答以下问题,python一级证书有用吗属于45项白名单吗,python一级证书有用吗小学生,今天让我们一起来看看吧!_少儿python考级能不考一级

随便推点

micro2440与PC同步问题(个人情况,仅供参考)_micro2440同步-程序员宅基地

文章浏览阅读881次。我用的是micro2440的3.5寸开发板,不知道实验室哪一年采购的,因为要用到wince,所以拿来准备学习一下。前期安装软件暂且不提,按照手册来应该没什么问题,可到了用activesync与PC同步的时候悲剧就发生了,烧写完wince系统,连上PC机无任何反应,而且本来很流畅的wince系统,只要一用USB跟PC连接就变得奇卡无比。在网上搜了大篇的资料也没找到解决的办法,迫不得已,只_micro2440同步

java实现国密算法SM3摘要加密_sm3utils jar包下载-程序员宅基地

文章浏览阅读847次。java实现SM3摘要加密_sm3utils jar包下载

面试问题某个项目中遇到过什么问题_面试中,面试官文你在项目中遇到过哪些问题-程序员宅基地

文章浏览阅读4.8w次,点赞4次,收藏21次。这是面试官很喜欢问的一个问题,你是会刁难你的一个地方。如果你在项目中是核心解决了一些技术难题,那这个问题对你来说应该是很好回答的。你可以说出这个项目遇到的技术问题,以及你是怎么解决的。这种问题往往可以从并发,稳定性,容错,性能等方面入手。如果你没有参与这种问题的解决,平时也要多关注其他人是怎么解决的,不要局限在自己的空间里。还有就是你可以给出一个场景,自己设计一种可行的解决方案,予以阐述。总之你要_面试中,面试官文你在项目中遇到过哪些问题

jar包冲突问题_jar:file:/d:/program%20files/apache-maven-3.5.4/re-程序员宅基地

文章浏览阅读472次。slf4j的jar包冲突。SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/D:/apache-maven-3.5.3/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/..._jar:file:/d:/program%20files/apache-maven-3.5.4/repository/io/springfox/spri

Mybatis自动去重,以及id vs result_mybatis去重-程序员宅基地

文章浏览阅读3.6k次。今天大部分时间一直被一个问题困扰:当程序执行某Mapper.java的一个list函数,明明底层的SQL语句和ELK中的日志都显示返回了376条记录(如图1,图2),最后程序却只返回了209条。图1: 日志显示此list函数返回了376条记录图2: 日志有376条相关的ResultSet记录我一度以为这跟今天尝试使用的MyBatis分页插件PageHelper(使用了MySql的limit)有关,后面发现不是。即使不使用PageHelper,问题依旧。而且我发现一点:实际返回的209条记录里,似乎_mybatis去重

idea Translation IP 地址无法访问_翻译失败: 访问ip地址不在可访问ip列表-程序员宅基地

文章浏览阅读1.5k次。本人首先按照网上的方法申请了百度翻译 API,配置后出现IP无法访问,后选择以下方法解决。配置如图:参考:https://blog.csdn.net/ilyucs/article/details/106603368_翻译失败: 访问ip地址不在可访问ip列表

推荐文章

热门文章

相关标签