Mysql如何对json数据进行查询及修改

目录
  • 对json数据进行查询及修改
    • 几个相关函数
    • 示例
    • 查询
    • 来看看修改
    • 删除
    • 插入
  • Mysql处理json数据

对json数据进行查询及修改

  • 使用 字段->'$.json属性' 进行查询条件
  • 使用 json_extract 函数查询,json_extract(字段, "$.json属性")
  • 根据json数组查询,用 JSON_CONTAINS(字段, JSON_OBJECT('json属性', "内容")) : [{}]查询这种形式的json数组
  • MySQL5.7以上支持JSON的操作,以及增加了JSON存储类型
  • 一般数据库存储JSON类型的数据会用JSON类型或者TEXT类型

几个相关函数

示例

我这里没有创建json的字段格式,而是使用了text存储json 。

注意:用JSON类型的话1)JSON列存储的必须是JSON格式数据,否则会报错。2)JSON数据类型是没有默认值的。

插入json格式的数据到这一列中:

{"age": "28", "pwd": "lisi", "name": "李四"}

查询

1、

select * from `offcn_off_main` where json_extract(json_field,"$.name") = '李四'

2、

select * from `offcn_off_main` where json_field->'$.name' = '李四' 

使用explain可以查看到无法使用索引。

所以需要修改:

mysql原生并不支持json列中的属性索引,但是我们可以通过mysql的虚拟列间接的为json中的某些属性创建索引,原理就是为json中的属性创建虚拟列,然后通过给虚拟列建立索引,从而间接的给属性创建了索引。

在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势----(其实我觉得还是有优势毕竟会少一些查询计算)

因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。

如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式。

格式如下:

fieldname <type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ] [ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]

所以我这里:

ALTER TABLE 'off_main' `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`json_field` ->> '$.name') not null;

Note: 利用操作符-» 来引用JSON字段中的KEY。在本例中字段names_virtual为虚拟字段,我把它定义成不可以为空。在实际的工作中,一定要集合具体的情况来定。因为JSON本身是一种弱结构的数据对象。也就是说的它的结构不是固定不变的。

给虚拟字段增加索引:

CREATE INDEX `names` ON `off_main`(`names_virtual`);  

注意如果虚拟字段并不是创建表是添加的,而是后面加的,增加索引时如果有的行中虚拟字段为null,但是又设置了它不能为null,那么索引无法创建成功,提示column can not be null.

增加索引后 explain看下即可看到用到了索引,并且虚拟字段的值会随着json字段的属性修改而自动变化。

来看看修改

update off_main set json_field = json_set(json_field,'$.phone', '132') WHERE id = 45
//同时修改多个
UPDATE offcn_off_main set json_field = json_set(json_field,'$.name',456,'$.age','bbb') WHERE id = 45 

json_set() 方法存在的则会覆盖,不存在的会添加。

删除

UPDATE offcn_off_main set json_field = json_remove(json_field,'$.pwd','$.phone') WHERE id = 45 

插入

UPDATE offcn_off_main set json_field = json_insert(json_field,'$.pwd','111') WHERE id = 45 

insert与update不同之处在于insert不存在的会增加,存在的不会覆盖

Mysql处理json数据

1.如果数据量小的话,将json数据直接复制到mysql的json字段中,如果数据过大可以通过java等后台形式对json数据解析,然后写入数据库中。

查询操作

select *,json->'$.features[0].geometry.rings' as rings from JSON;

从一张表读取一部分数据存入另一张表中(一条数据)

insert into DT_village(name, border) SELECT
  json->'$.features[0].attributes.CJQYMC',json->'$.features[0].geometry.rings'
from JSON;

读取json数据并写入数据库(此时使用的是定义函数的形式来执行方法,可以定义便量)

#清空数据库
TRUNCATE table DT_village;

#定义存储过程
delimiter //
DROP PROCEDURE IF EXISTS insert_test_val;
##num_limit 要插入数据的数量,rand_limit 最大随机的数值
CREATE PROCEDURE insert_test_val()
  BEGIN

    DECLARE i int default 0;
    DECLARE a,b varchar(5000);

    WHILE i<10 do
      set a=CONCAT('$.features[',i,'].attributes.CJQYMC');
      set b=CONCAT('$.features[',i,'].geometry.rings');
      insert into DT_village(name, border) select
              #json->'$.features[0].attributes.CJQYMC',json->'$.features[0].geometry.rings'
                                                 # (json->a),(json->b)
   json_extract(json,a),json_extract(json,b)
      from JSON;
      set i = i + 1;

    END WHILE;

  END
//

#调用存储过程
call insert_test_val();

调用游标的方式获取jsosn数据中的一行,并执行插入操作

delimiter //
drop procedure if exists StatisticStore;
CREATE PROCEDURE StatisticStore()
  BEGIN
    #创建接收游标数据的变量
    declare j json;#存储json数据
    DECLARE i int default 0; #创建总数变量,记录执行次数,控制循环
    DECLARE a,b,c varchar(5000);#定义json数组中的某个数据的键值

    #创建结束标志变量
    declare done int default false;
    #创建游标
    declare cur cursor for select json from JSON where name = '1';
    #指定游标循环结束时的返回值
    declare continue HANDLER for not found set done = true;
    #设置初始值
    set a=CONCAT('$.features[',i,'].attributes.XZQDM');
    set b=CONCAT('$.features[',i,'].attributes.XZQMC');
    set c=CONCAT('$.features[',i,']');
    #打开游标
    open cur;
    #开始循环游标里的数据
    read_loop:loop
      #根据游标当前指向的一条数据
      fetch cur into j;
      #判断游标的循环是否结束
      if done then
        leave read_loop;#跳出游标循环
      end if;
      #这里可以做任意你想做的操作
      WHILE i<11 do
        insert into dt_border(xzq_code,name,border) select
                                                           json_extract(j,a),json_extract(j,b),json_extract(j,c)
        from JSON;
        set i = i + 1;
      END WHILE;
      #结束游标循环
    end loop;
    #关闭游标
    close cur;

    #输出结果
    select j,i;
  END;
#调用存储过程
call StatisticStore();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mysql将查询结果集转换为JSON数据的实例代码

    Mysql将查询结果集转换为JSON数据 前言学生表学生成绩表查询单个学生各科成绩(转换为对象JSON串并用逗号拼接)将单个学生各科成绩转换为数组JSON串将数组串作为value并设置key两张表联合查询(最终SQL,每个学生各科成绩)最终结果 前言 我们经常会有这样一种需求,一对关联关系表,一对多的关系,使用一条sql语句查询两张表的所有记录,例:一张学生表,一张学生各科成绩表,我们想要用一条SQL查询出每个学生各科成绩: 学生表 CREATE TABLE IF NOT EXISTS `stu

  • mysql根据json字段内容作为查询条件(包括json数组)检索数据

    最近用到了mysql5.7的json字段的检索查询,发现挺好用的,记录一下笔记我们有一个日志表,里面的data字段是保存不同对象的json数据,遇到想根据里面的json的字段内容作为条件查询的情况 mysql根据json字段的内容检索查询数据 使用 字段->'$.json属性'进行查询条件 使用json_extract函数查询,json_extract(字段,"$.json属性") 根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT('json属性'

  • mysql json格式数据查询操作

    预设表名是 base_data , json列名是 json_value json_value的值是 {"ids":["a","b"],"datas":[{"name":"张三"}]} 那么查询语句应该是 select * from base_data where JSON_CONTAINS(json_value -> "$.ids", JSON_ARRAY('

  • mysql5.6及以下版本如何查询数据库里的json

    MySQL里面保存数据有时候会把一些杂乱且不常用的时候丢进一个json字段里面 下面说说mysql存储json注意那些格式吧: 1:注意保存是中文不要变成转码的,转码之后导致查询非常麻烦,压缩时候后面多带一个参数,方便不止一点点哟! json_encode(array(),JSON_UNESCAPED_UNICODE); 好处:这样查询的时候中文字符更好的匹配查询 2:字段统一    存的时候最好开始定好字段名称  ,开发一个大点的项目不可能一个人开发统一字段可以减少很多不需要的麻烦和字段不同意

  • MySQL对JSON类型字段数据进行提取和查询的实现

    目录 前言 1. 问题现象 2. 解决方案 3. JSON数据查询 3.1 一般基础查询操作 3.2 一般函数查询操作 4. JSON数据新增更新删除 前言 昨天上线后通过系统报警发现了一个bug,于是紧急进行了回滚操作,但是期间有用户下单,数据产生了影响,因此需要排查影响了哪些订单,并对数据进行修复. 1. 问题现象 由于bug导致了订单表的customer_extra_info字段的hasFreightInsurance误更新成了“是”,因此需要查询回滚前一共有多少被误更新为“是”的订单,如

  • Mysql 直接查询存储的Json字符串中的数据

    我们平时使用mysql,出于项目需求,可能需要直接将Java对象或者一个大json,直接存到表中的某个字段中:使用的时候再查出来,反序列化到对象或者一个Map中,方便我们操作: 大多时候,我们可能并不需要所有的数据,只想使用这个对象或者json中的某一个值,来做逻辑判断而已 那我们可以这样做,例如:原来我们需要查出某个字段的数据,然后反序列化成对象再调用其中的一个属性 SELECT content FROM table_name WHERE id = 32; 查询结果:列名:content结果:

  • Mysql如何对json数据进行查询及修改

    目录 对json数据进行查询及修改 几个相关函数 示例 查询 来看看修改 删除 插入 Mysql处理json数据 对json数据进行查询及修改 使用 字段->'$.json属性' 进行查询条件 使用 json_extract 函数查询,json_extract(字段, "$.json属性") 根据json数组查询,用 JSON_CONTAINS(字段, JSON_OBJECT('json属性', "内容")) : [{}]查询这种形式的json数组 MySQL

  • MYSQL中的json数据操作代码

    目录 MYSQL中的json数据操作 1.2 基础查询操作 1.2.1 一般json查询 1.2.2 多个条件查询 1.2.3 json中多个字段关系查询 1.2.4 关联表查询 1.3 JSON函数操作 1.3.1 官方json函数 1.3.2 ->.->>区别 1.3.2.2 在where条件中使用 1.3.3 json_extract():从json中返回想要的字段 1.3.4 JSON_CONTAINS():JSON格式数据是否在字段中包含特定对象 1.3.5 SON_OBJEC

  • MySQL中几种数据统计查询的基本使用教程

    统计平均数 SELECT AVG() FROM 语法用于从数据表中统计数据平均数. 语法: SELECT AVG(column) FROM tb_name 该 SQL 语法用于统计某一数值类型字段的平均数,AVG() 内不能是多个字段,字符串等类型虽然可以执行,但无意义. 例子: SELECT AVG(uid) FROM user 得到查询结果: 2.5000 当然在此统计 uid 的平均数是无实际生产意义的,只是为了演示 AVG() 语法的用法. 统计数据之和 SELECT SUM() FRO

  • 详解JSON1:使用TSQL查询数据和更新JSON数据

    JSON是一个非常流行的,用于数据交换的数据格式,主要用于Web和移动应用程序中.JSON 使用键/值对(Key:Value pair)存储数据,并且表示嵌套键值对和数组两种复杂数据类型,仅仅使用逗号(引用Key)和中括号(引用数组元素),就能路由到指定的属性或成员,使用简单,功能强大.在SQL Server 2016版本中支持JSON格式,使用Unicode字符类型表示JSON数据,并能对JSON数据进行验证,查询和修改.推荐一款JSON验证和格式化的工具:json formatter. 一,

  • MySQL操作之JSON数据类型操作详解

    上一篇文章我们介绍了mysql数据存储过程参数实例详解,今天我们看看MySQL操作之JSON数据类型的相关内容. 概述 mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点.但mysql毕竟是关系型数据库,在处理json这种非结构化的数据时,还是比较别扭的. 创建一个JSON字段的表 首先先创建一个表,这个表包含一个json格式的字段: CREATE TABLE table_name ( id INT NOT NULL

  • Oracle 处理json数据的方法

    目录 备注: 一. Json数据存储 二. Json数据insert 三. json数据update 四. json数据查询 五. 常用的json函数 5.1 json_array 5.2 JSON_ARRAYAGG 5.3 JSON_DATAGUIDE 5.4 JSON_MERGEPATCH 5.5 JSON_OBJECT 5.6 JSON_OBJECTAGG 5.7 JSON_QUERY 5.8 json_serialize 5.9 JSON_TABLE 5.10 JSON_TRANSFOR

  • 使用python将mysql数据库的数据转换为json数据的方法

    由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问Mysql数据库及读取获取数据(前提需要安装MySQLdb第三方库哦),以及如何将数据转换为json数据,最后保存成文件输出. 代码如下:注释比较详细了. # coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysq

  • Mysql内储存JSON字符串根据条件进行查询

    目录 前言 一.Json是什么? 二.不同情况 1.模糊查询json类型字段 2.精确查询json类型字段 3.模糊查询JsonArray类型字段 4.精确查询JsonArray类型字段 总结 前言 JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序.这个字符串可以表示数组和复杂的对象,而不仅仅是键和值的简单列表,在Mysql中存储Json字符串可以极大的简便存储的复

  • Mysql怎么存储json格式数据详解

    目录 前言 JSON 数据类型推荐使用在不经常更新的静态数据存储 查询 json数据 增加索引 使用场景 总结 前言 Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式.在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息 JSON 数据类型推荐使用在不经常更新的静态数据存储 创

随机推荐