当前位置:首页 > 技术分析 > 正文内容

MySQL_JSON格式存取_mysql操作json类型数据

ruisui885个月前 (02-08)技术分析18

昨天说了,今天单独拿一篇出来写一下JSON格式的读取。在很久很久以前,MySQL是没有JSON格式的,那个时候还很羡慕非关系型数据库,它们可以自由存储各种数据。MySQL从5.7版本开始就支持JSON格式的,从此也可以对外号称关系型数据和非关系型数据都通吃了。但是最开始对JSON格式数据的优化不是很优化,效率有点低。但这个问题他们自己也肯定知道的,先有再优嘛,于是8.0后MySQL对JSON格式的优化已经很好了,现在使用起来如果数据量不是特别特别大,使用效果还是很好的。


下面就主要介绍一下JSON格式的创建、插入、读取和修改,基本如果不是开发人员、数据库管理人员,作为一个数据分析师应该是够用了。


【创建】

可以使用SQL语句创建,如下,最后就创建了一个带JSON格式的表格↓

CREATE TABLE `salary` (
  `姓名` varchar(6) NOT NULL,
  `月份` varchar(3) NOT NULL,
  `工资` decimal(12,2) DEFAULT NULL,
  `个税` decimal(12,2) DEFAULT NULL,
  `其他费用` json DEFAULT NULL,
  PRIMARY KEY (`姓名`,`月份`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当然也是可以通过Navicat直接创建就行了↓

【插入数据】

然后使用常规的INSERT INTO插入数据就行了,需要注意的是JSON格式使用键值对组成的,也可以内部嵌套数据,我们这里插入7条数据,SQL语句如下↓

INSERT INTO salary VALUES("李华","7月",2000,11,'{"chailv":333,"gaowen":222,"xiayu":11,"zhaodai":1200}');
INSERT INTO salary VALUES("李华","8月",2200,11,'{"chailv":335,"gaowen":225,"xiayu":45}');
INSERT INTO salary VALUES("韩梅梅","7月",4400,33,'{"chailv":158,"gaowen":222}');
INSERT INTO salary VALUES("韩梅梅","8月",5500,66,'{"chailv":456,"gaowen":222,"zhaodai":5000}');
INSERT INTO salary VALUES("张三三","7月",2000,11,'{"chailv":100,"gaowen":222}');
INSERT INTO salary VALUES("张三三","8月",3000,14,'{"chailv":200,"gaowen":222}');
INSERT INTO salary VALUES("张三三","10月",4000,51,'{"chailv":300,"gaowen":222,"qita":{"q1":111,"q2":222}}');

除了使用{}插入JSON格式数据,还可以使用JSON_OBJECT()函数转换成JSON格式的数据,下面再插入一条数据,SQL语句如下↓

INSERT INTO salary VALUES("李华","9月",2454,15,JSON_OBJECT("chailv",999,"zhaodai",1111));


【读取数据】

一般情况下数据分析就用这个查询功能就行了。json_extract()函数:从json中返回想要的字段,用法是,json_extract(字段名,$.json字段名)。也可以使用 json字段名->'$.json属性'进行查询,下面分别有两种查询方式进行演示,把其他费用里面的各项费用单独查询出来。

SELECT
 姓名,月份,工资,个税,
 JSON_EXTRACT(其他费用, '$.chailv') AS 差旅费,
 JSON_EXTRACT(其他费用, '$.gaowen') AS 高温费,
 其他费用->'$.xiayu' AS 下雨费,
 其他费用->'$.zhaodai' AS 招待费
FROM
 salary


JSON里面的字段也是可以作为条件进行查询的,比如我们要查询差旅费大于300的人员和月份,SQL预计如下↓

SELECT
 姓名,月份,工资,个税,
 JSON_EXTRACT(其他费用, '$.chailv') AS 差旅费
FROM
 salary
WHERE
 JSON_EXTRACT(其他费用, '$.chailv')>300


如果遇到JSON嵌套的情况,也是可以用两层JSON_EXTRACT函数进行查询的,比如张三三10月其他费用里面有个q1和q2两个费用,现在需要单独查询出来,SQL语句如下↓

SELECT
 姓名,月份,工资,个税,
 JSON_EXTRACT(JSON_EXTRACT(其他费用, '$.qita'),'$.q1') AS Q1费用,
 JSON_EXTRACT(JSON_EXTRACT(其他费用, '$.qita'),'$.q2') AS Q2费用
FROM
 salary


JSON_KEYS函数可以查询出JSON字段里面的键名字,SQL语句如下↓

SELECT
 姓名,月份,工资,个税,
 JSON_KEYS(`其他费用`)
FROM
 salary


【更新数据】

UPDATE 
 salary 
SET 
 `其他费用` = JSON_SET( `其他费用`, "$.chailv", 10000, "$.gaowen", 2000 ) 
WHERE
 姓名 = "韩梅梅" AND `月份` = "8月"


End

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1782.html

标签: json_extract
分享给朋友:

“MySQL_JSON格式存取_mysql操作json类型数据” 的相关文章

jvm疯狂吃内存,到底是谁的锅?

jvm应该是每一个java程序员都需要掌握的内容,但是在没有遇到问题之前,很多都是基于理论的,唯有实战才能增加个人的知识储备。本文是从一个角度来分析是谁在狂吃内存,希望对你有所帮助。本文是易观技术人员注意到一台开发机上各个微服务进程占用内存很高,随即便展开了调查......ps:本文来源于:http...

面试被逼疯:聊聊Python Import System?

面试官一个小时逼疯面试者:聊聊Python Import System?对于每一位Python开发者来说,import这个关键字是再熟悉不过了,无论是我们引用官方库还是三方库,都可以通过import xxx的形式来导入。可能很多人认为这只是Python的一个最基础的常识之一,似乎没有可以扩展的点了,...

雅马哈TMAX 560 TECH MAX 外媒深度测评

应雅马哈(Yamaha)的邀请,在葡萄牙埃斯托里尔对全新的Yamaha TMAX 560 Tech Max踏板车进行了测试,在这里TMAX 560 Tech Max售价为11649英镑。雅马哈TMAX长期以来一直站在踏板车的顶端,就声誉和知名度而言,它是当之无愧的大踏板界NO.1。2020 TMAX...

USB电池充电基础:应急指南

USB为便携设备供电与其串行通信功能一样,已经成为一种标准应用。如今,USB 供电已经扩展到电池充电、交流适配器及其它供电形式的应用。应用的普及带来的一个显著效果是便携设备的充电和供电可以互换插头和适配器。因此,相对于过去每种装置都采用专用适配器的架构相比,目前的解决方案允许采用多种电源进行充电。毋...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...

前端路由简介以及vue-router实现原理

作者:muwoo 来源:https://zhuanlan.zhihu.com/p/37730038后端路由简介路由这个概念最先是后端出现的。在以前用模板引擎开发页面时,经常会看到这样http://www.xxx.com/login 大致流程可以看成这样:浏览器发出请求服务器监听到80 端口(或443...