iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql如何对json数据进行查询及修改
  • 703
分享到

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

Mysqljson修改Mysqljson查询Mysql对json数据 2022-07-05 16:07:19 703人浏览 八月长安
摘要

目录对JSON数据进行查询及修改几个相关函数示例查询来看看修改删除插入Mysql处理json数据对json数据进行查询及修改 使用 字段->'$.json属性' 进行查询条件使用 json_extr

对json数据进行查询及修改

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

几个相关函数

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

示例

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

我这里没有创建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();

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

您可能感兴趣的文档:

--结束END--

本文标题: Mysql如何对json数据进行查询及修改

本文链接: https://www.lsjlt.com/news/33208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql怎么对json数据进行查询及修改
    这篇文章主要介绍“Mysql怎么对json数据进行查询及修改”,在日常操作中,相信很多人在Mysql怎么对json数据进行查询及修改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql怎么对json数据进...
    99+
    2023-07-02
  • MySQL对JSON数据进行查询
    MySQL根据JSON字段的内容检索查询数据 使用 字段 -> ‘$.json’ 属性’ 进行查询条件 以下这两种会快很多,可以自己测试 使用 json_extract 函数查询,json_extract(字段, “$.json...
    99+
    2023-08-16
    mysql json mybatis
  • MySQL对JSON数据进行IN查询
      JSON相关函数可以看这个博客 【MySQL】对JSON数据操作(全网最全)_mysql json_0世界和平0的博客-CSDN博客 SELECT 字段名FROM 表名WHERE CASE WHEN JSON...
    99+
    2023-09-05
    json mysql 后端 数据库
  • mysql怎么对查询出来的数据进行修改
    要对查询出来的数据进行修改,可以使用UPDATE语句。该语句用于更新表中的数据。 语法如下: UPDATE table_name S...
    99+
    2024-04-09
    mysql
  • 怎么在postgresql中对jsonb数据进行查询和修改
    今天就跟大家聊聊有关怎么在postgresql中对jsonb数据进行查询和修改,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JS是什么JS是JavaScript的简称,它是一种直译式...
    99+
    2023-06-06
  • MySQL对JSON类型字段数据进行提取和查询的实现
    目录前言1. 问题现象2. 解决方案3. JSON数据查询3.1 一般基础查询操作3.2 一般函数查询操作4. JSON数据新增更新删除前言 昨天上线后通过系统报警发现了一...
    99+
    2024-04-02
  • 如何在mysql中对查询进行优化
    本篇文章为大家展示了如何在mysql中对查询进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、优化方法(1)重新定义表的关联顺序(多张表关联查询时,并不一定按照SQL中指定的顺序进行,但有一...
    99+
    2023-06-15
  • mysql如何进行表数据的增删改查
    这篇文章主要介绍mysql如何进行表数据的增删改查,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在mysql中,可以使用SELECT语句进行表数据的查询,使用INSERT语句...
    99+
    2024-04-02
  • php怎么进行数据库查询和修改操作
    PHP 是一种广泛使用的服务器端脚本语言,用于 Web 开发。当开发者需要从数据库中读取数据或对数据库进行修改时,PHP 提供了一些简单而强大的功能,这些功能使得查询和修改数据库变得轻松自如。本文将介绍一些 PHP 中常用的数据库查询和修改...
    99+
    2023-05-14
  • nodejs框架如何对json文件进行增删改查
    这篇文章主要为大家展示了“nodejs框架如何对json文件进行增删改查”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“nodejs框架如何对json文件进行增删...
    99+
    2024-04-02
  • 如何使用MySQL进行高效的数据查询?
    如何使用MySQL进行高效的数据查询?MySQL是一种常用的关系型数据库管理系统,广泛应用于网站开发、数据分析等领域。在实际应用中,进行高效的数据查询对于提升系统性能和用户体验至关重要。本文将介绍如何使用MySQL进行高效的数据查询,并给出...
    99+
    2023-10-22
    MySQL 查询 高效
  • 如何对 Golang 中的数据库查询进行分页?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Mysql中进行一周数据查询
    Mysql中查询周一到周日的数据 在查询周数据时,会发现国外的一周的起始是周日,即周日到周六为一周,而国内的一周是指周一到周日。 最近一周的查询语句为: select * from 表名称 ...
    99+
    2023-09-07
    mysql 数据库 sql
  • mysql进行数据查询的方法
    这篇文章主要介绍mysql进行数据查询的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先我们创建一个数据表students,本操作都基于此数据表,此数据表数据如下:查询记录se...
    99+
    2024-04-02
  • 使用Spring MVC与Mybatis如何对Mysql数据库进行分页查询
    使用Spring MVC与Mybatis如何对Mysql数据库进行分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。第一步,搭建这个小案例,引入spring和mybtis的...
    99+
    2023-05-31
    springmvc mysql mybatis
  • 如何进行SQL大量数据查询
    这篇文章主要介绍“如何进行SQL大量数据查询”,在日常操作中,相信很多人在如何进行SQL大量数据查询问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何进行SQL大量数据查询”...
    99+
    2024-04-02
  • delphi怎么对sql数据库进行查询
    在Delphi中进行SQL数据库查询,可以通过以下步骤实现: 建立数据库连接:使用TADOConnection或其他数据库连接组件...
    99+
    2024-04-09
    delphi 数据库
  • 怎么使用mysql进行数据查询
    要使用MySQL进行数据查询,您需要按照以下步骤进行操作: 连接到MySQL数据库。可以使用命令行或图形界面工具连接到MySQL...
    99+
    2024-04-09
    mysql
  • 如何用数据库分页查询语句进行数据库查询
    这篇文章主要介绍“如何用数据库分页查询语句进行数据库查询”,在日常操作中,相信很多人在如何用数据库分页查询语句进行数据库查询问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2024-04-02
  • 如何进行mysql多表查询
    这期内容当中小编将会给大家带来有关如何进行mysql多表查询,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、准备数据库init.sql文件内容如下:SET N...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作