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

智能推荐

【蓝桥杯选拔赛真题30】C++字母转换 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析-程序员宅基地

文章浏览阅读306次。C/C++字母转换第十三届蓝桥杯青少年创意编程大赛C++选拔赛真题一、题目要求1、编程实现给定一个大写字母,输出其对应的小写字母2、输入输出输入描述:只有一行,输入一个大写字母输出描述:只有一行,输出大写字母对应的小写字母输入样例:A输出样例:a二、算法分析

OV2640帧率的计算_ov2640 cif-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏25次。从时序图看,1帧的时间Tframe=672*Tline, Tline = 1190Tp, Tp与sensor寄存器(FF=1)0x11有关:Tp = XVCLK/(CLKRC[5:0] + 1), XVCLK为外部输入的频率.3.1 SVGA Preview, 30fps, 24Mhz input clockSCCB_salve_Address = 0x60;write_S_ov2640 cif

【ANSYS 学习笔记】Case05_Basic Transient Sources and Circuit-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏15次。• Transient Setup – This workshop discusses basic setup details of 2D Magnetic Transient solver –本研讨会讨论2D电磁瞬态求解器的基本设置细节 – The transient setup is described with two different excit..._number of conductors

小e开发板(esp8266)连接Arduino实现WiFi扫描_esp8266 arduino 查询连接数-程序员宅基地

文章浏览阅读5.2k次,点赞5次,收藏13次。博主的第一篇文章,望多多支持!本文章教会你使用小e开发板。小e开发板连接Arduino的教程在这里!_esp8266 arduino 查询连接数

rabbitMQ 死信队列_死信队列监听后删除消息-程序员宅基地

文章浏览阅读202次。死信队列用于存储过期的消息和消费失败的消息。当消费者从正常队列移除后进入到死信队列。1:消息变成死信 一 般是由于以下3种情况: 1 :消息被拒绝 (Basic.Reject/Basic .Nack),井且设置 requeue 参数为 false;// 创建队列消费者final Consumer consumer = new DefaultConsumer(..._死信队列监听后删除消息

随便推点

Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法-程序员宅基地

文章浏览阅读176次。Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法: 一、先安装试用版,然后在“添加或删除程序”里找到VS2008,点“更改/删除”就会看到一个输入序列号的地方,把序列号输进去,点“升级”按钮即可,Team Suite和Professional通用。 二、用UltraISO打开VS的ISO安装文件,把Setup\setup.sdb文件解压缩出来,一定记得..._xmq2y4t3v6xj48yd3k2v6c4wt

Ubuntu Server内核优化提高并发_ubuntu server 系统优化-程序员宅基地

文章浏览阅读3.1k次。设置文件打开句柄数# 查看系统默认的值ulimit -n# 设置最大打开文件数ulimit -n 1000000这样只能在当前 shell 中有效。通过修改配置文件的方式修改程序最大打开句柄数可以永久有效:sudo vim /etc/security/limits.confroot soft nofile 1040000root hard nofile 1040000..._ubuntu server 系统优化

【考研数学】零基础跟「张宇」的几点体会-程序员宅基地

文章浏览阅读302次,点赞3次,收藏8次。(比如我也听了武忠祥老师的课,不得不说某些方法确实让人拍手叫绝,但是一看题呢,该不会的还是不会。这些阶段如果保质保量的完成,在考试里大致对应的分数是 0,80,120,130。但很多人不知道展开到几项,哪些是可以扔掉的,把很简单的题算得很复杂,有的还背了很多不必要的技巧,纯属浪费时间。入门,基础,强化,是递进关系,不能越级!综测会一直持续到备考结束,也就是说将近一年的时间里,它都会通过滚动复习,让你持续保持火热的手感~真的是保姆级了!根据你自己的薄弱低点,针对性地练,哪里不会练哪里,才能吃透,而且省时间。

【翻译+理解】Channel Access Protocal——EPICS Base-3.16版CA协议 - 基本概念_epics ca协议-程序员宅基地

文章浏览阅读2k次。参考文献:1. 官方CA协议说明 https://epics.anl.gov/base/R3-16/1-docs/CAproto/index.html#_concepts(本翻译的原文)2. EPICS培训PPT EPICS_Introduction_PSI2011.ppt https://download.csdn.net/download/u013894429/10823381(找不到..._epics ca协议

基于java和微信小程序的 点餐外卖小程序-后台Java 毕业设计毕设源码最终作品_java外卖小程序源码-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏13次。微信小程序在线点餐外卖系统主要包含功能:微信登录、普通用户注册和登录、用户信息修改、用户密码修改;用户首页、菜品分类、产品浏览、增加数量、减少数量、订餐、收藏、地址管理、评论、广告设置等;提供项目源代码(小程序+接口+后台)。开发工具:IDEA2020开发环境:JDK1.8 +Tomcat8数据库:Mysql8小程序后台..._java外卖小程序源码

jqGrid用法及增删改查方法_jqgrid 列表增删改查-程序员宅基地

文章浏览阅读3.5k次。jquery grid是富客户端的,基于XML , Ajax网格插件的jQuery库。 jqGridView提供专业的解决方案,代表和编辑表格数据在网络上。精心设计的,具有强大的脚本API的,这可编辑网格是很简单的DHTML与XML 的配置,并显示出令人信服的成果与大量数据。现在我现在熟悉一下jquery grid的的使用方法和一些常用的option设置。1.调用gridjqGrid已经可_jqgrid 列表增删改查

推荐文章

热门文章

相关标签