【MySQL】JSON 格式字段处理

这篇具有很好参考价值的文章主要介绍了【MySQL】JSON 格式字段处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL 5.7 版本后已支持 JSON 格式,这虽是 MySQL 的一小步,但可以说是程序开发的一大步,再也不用将 JSON 内容塞到 VARCHAR 类型字段了,程序设计也会变得更加灵活。网上大多只针对JSONObject 对象类型,本文也将详解 JSONArray 数组类型。

1 定义

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以键值对的方式存储数据,并以大括号和方括号进行标记,MySQL JSON 格式字段可以存储 JSON 对象和数组。

JSONObject:对象

{
  "name": "yinyu",
  "age": "18"
}

JSONArray:数组

["yinyu", "tom", "jack"]

而且对象和数组都可以嵌套其他对象或数组,从而形成复杂的数据结构,比如 👇

[
  {
    "name": "yinyu",
    "age": [18, 28, 38]
  },
  "tom",
  "jack"
]

对于对象来说,它的键只能为字符串,值类型支持 null,string,boolean,number,object,array 等。

建表 SQL

在创建表时,可以指定字段类型为 JSON ,不过无需指定 JSON 类型的长度,因为默认值只能为 null 。此外,JSON 字段类型可以根据实际存储的数据自动推断是对象还是数组结构,因此无需显式指定。

create table `test_json_tb` (
  `id` bigint(20) not null auto_increment,
  `json_obj` json default null comment 'json 对象字段',
  `json_arr` json default null comment 'json 数组字段',
  primary key (`id`)
) engine=innodb default charset=utf8mb4;

插入数据 SQL

insert into test_json_tb(json_obj, json_arr) values
('{"name":"yinyu", "age":18, "tags":["rap", "dance"]}', '["yinyu", "yinyu1", "yinyu2"]'),
('{"name":"tom", "age":19, "tags":["rap"]}', '["tom"]'),
('{"name":"jack", "age":20, "tags":["dance"]}', '[{"name":"jack"}, {"age":"20"}]');

建表如图 👇,接下来将使用该数据表来教学 MYSQL JSON 常用函数。

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

2 原生查询

原生查询规则

针对 JSONObject 对象的规则:json对象字段名->’$.json属性名’

针对 JSONArray 数组的规则:json数组字段名->’$[数组索引]’  or  json对象字段名->’$数组的键名[数组索引]’

示例:

select
	json_obj->'$.name' name,
	json_obj->'$.tags[0]' tags0,
	json_arr->'$[0]' arr0
from test_json_tb;

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

可以看到查询到的字段字符串类型有个双引号,那么可以通过将 -> 替换成 ->> 去除,转义符同时也会去除。

条件查询

那么我们使用原生查询规则来试下条件查询,比如 👇

select *
from test_json_tb
where json_obj->'$.name' = 'yinyu';

由于 JSON 字段的模糊搜索仅支持 %str% 格式,因此它的模糊搜索时索引无效:

select * 
from test_json_tb 
where json_obj->'$.name' like '%yin%';

对于联表查询、多条件查询均是支持的~

3 常用函数

JSONObject 对象类型和 JSONArray 数组类型基本上都可以使用以下函数,而网上攻略大多只针对JSONObject 对象类型,因此我补充了 JSONArray 数组类型的相关规则和示例。

① JSON_EXTRACT() 提取

规则和原生查询类型~

针对 JSONObject 对象类型,规则:json_extract(对象字段名, '$.属性名')

针对 JSONArray 数组类型,规则:json_extract(数组字段名, '$[数组索引]') or json_extract(对象字段名, '$.数组的键名[数组索引]')

select id,
	json_extract(json_obj,'$.name') as name,
	json_extract(json_obj,'$.tags[1]') as tags1,
	json_extract(json_arr,'$[0]') as arr0
from test_json_tb;

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

若想去除双引号,可以使用 JSON_UNQUOTE(JSON_EXTRACT())。

② JSON_SET() 更新

将数据插入到 JSON 格式字段中,如果是 JSONObject 对象类型,则有 key 则替换,无 key 则新增;如果是 JSONArray 数组类型,则根据索引进行替换或新增,规则以 JSONObject 对象类型为例。

规则:JSON_SET(json数据, '$.属性名', '更新/插入的值/数组', '$.数组的键名[数组索引]', '更新/插入的值'......)

示例:比如修改第2条数据,将他的 age 修改为 20,并且 tags 增加一个 “dance”:

update test_json_tb t1
set json_obj = json_set(t1.json_obj,'$.age',20, '$.tags[1]', 'dance') 
where id=2;

更新后的记录 👇

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

③ JSON_INSERT() 插入

JSON_SET() 类似,但 JSON_INSERT() 只插入不更新(有 key 保持原样)。

规则:JSON_INSERT(json数据, '$.属性名', '更新/插入的值/数组', '$.数组的键名[数组索引]', '更新/插入的值'......)

示例:比如给第3条数据新增一个 age 属性和 from 属性,但是执行 sql 后会发现 age 属性插入是不生效的,这是因为 age 属性已存在,而 from 属性新增成功。

update test_json_tb t1
set json_obj = json_insert(t1.json_obj,'$.age', 21,'$.from', 'china') 
where id=3;

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

④ JSON_REPLACE() 替换

JSON_REPLACE() 的作用就是只替换/更新,不插入,针对JSONObject 对象类型,则有 key 则替换,无 key 则保持原样;如果是 JSONArray 数组类型,则根据索引进行替换,规则以 JSONObject 对象类型为例。

规则:JSON_REPLACE(json数据, '$.属性名', '替换的值/数组', '$.数组的键名[数组索引]', '替换的值'......)

示例:接着上边第3条记录,给 age 属性的值替换成 21,tags 数组的第一个值替换成 “rap”

update test_json_tb t1
set json_obj = json_replace(t1.json_obj,'$.age', 21,'$.tags[0]', 'rap') 
where id=3;

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

注意:如果该属性或数组索引不存在,那么是不会进行替换的,和 JSON_INSERT() 正好是反着来,而 JSON_SET() 集合了这两者。

⑤ JSON_REMOVE()  移除

顾名思义,该函数的作用是从删除 JSON 数据。

规则:JSON_REMOVE(json数据, '$.属性名', '$.数组的键名[数组索引]')

示例:之前不是给第3条记录增加了 from 属性么,我们来移除它,并且移除 json_arr 字段的第二个属性。

update test_json_tb t1
set json_obj = json_remove(t1.json_obj,'$.from'),
	json_arr = json_remove(t1.json_arr,'$[1]') 
where id=3;

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

⑥ JSON_OBJECT()、JSON_ARRAY()

这两个函数分别对应 JSON 对象和 JSON 数组,分别用来创建 JSON 对象和 JSON 数组,可以搭配 JSON_SET()、JSON_INSERT()、JSON_REPLACE() 等函数,也可用于查询等操作。

规则:JSON_OBJECT(键名, 值, 键名, 值......)、JSON_ARRAY(元素、元素、元素......)

接下来以插表 SQL 作为示例:

insert into test_json_tb(json_obj, json_arr) values
(json_object('age',22,'name','mike','tags',json_array('sing')), 
 json_array(11,22,33));

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

⑦ JSON_CONTAINS() 是否包含

校验 JSON 数据中是否包含特定值(可以是属性、对象、数组、数组索引等)。

规则:JSON_CONTAINS(target, candidate[, path]),详情看示例

示例1:查询出 json_obj 字段中包含 age = 18 的记录

select * from test_json_tb 
where json_contains(json_obj, json_object('age',18))

示例2:查询出 json_arr 字段中包含 11 的记录

select * from test_json_tb 
where json_contains(json_arr, json_array(11))

示例3:查询出 json_obj 字段中 tags 属性中同时包含 “rap” 和 “dance” 的记录


select * from test_json_tb 
where json_contains(json_obj, json_array('rap','dance'), '$.tags')

⑧ JSON_TYPE()类型

查询某个 JSON 字段属性类型。

规则:JSON_TYPE(原生查询或 JSON_EXTRACT())

示例:查看 json_obj 字段中 tags 属性的类型

select json_obj->'$.tags' ,json_type(json_obj->'$.tags') as type 
from test_json_tb 
-- or
select json_extract(json_obj,'$.tags') ,
	   json_type(json_extract(json_obj,'$.tags')) as type 
from test_json_tb 

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

⑨ JSON_KEYS() 键名

查询 JSON 数据中的所有键/key,返回列表,针对 JSON 对象,因为数组是没有键的。

规则:JSON_KEYS(json_value)

select json_keys(json_obj) 
from test_json_tb 

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

⑩ JSON_SEARCH()  深度查询

JSON_SEARCH() 函数,简单来说就是加强版查询,其实 JSON_EXTRACT() + limit SQL也能达到效果。

规则:JSON_SEARCH(json数据,one/all,json 查询规则)

one 是返回1条记录,all 是返回符合条件的所有记录

示例1:查询路径--以 json 对象为例

select json_search(json_obj,'all','yinyu', null)
from test_json_tb

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

他会返回符合条件的记录里的路径,若是路径编写有困难,那么可以试下这个深度查询!

null -- 若搜索内容不存在,则返回 NULL,第三个参数为值。

示例2:条件查询--针对 json 对象(第五个参数为路径,条件查询时搭配  is not null)

查询 json_obj 字段中 name 属性为 “yinyu” 的记录

select *
from test_json_tb
where json_search(json_obj,'all','yinyu', null,'$.name') is not null

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

示例3:条件查询--针对 json 数组

查询 json_arr 字段中第一个元素为 “yinyu” 的记录

select *
from test_json_tb
where json_search(json_arr,'all','yinyu', null,'$[0]') is not null

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库

示例4:模糊查询

select *
from test_json_tb
where json_search(json_obj,'all','%t%', null,'$.name') is not null

【MySQL】JSON 格式字段处理,必知必会,mysql,数据库


总结

本文完善了 JSON 数组的相关操作,大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。文章来源地址https://www.toymoban.com/news/detail-662940.html

到了这里,关于【MySQL】JSON 格式字段处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL必知必会:MySQL中的Schema与DataBase

    涉及到数据库的模式有很多疑惑,问题经常出现在模式和数据库之间是否有区别,如果有,区别在哪里。 取决于数据库供应商 对schema(模式)产生疑惑的一部分原因是数据库系统倾向于以自己的方式处理模式 (1)MySQL的文档中指出,在物理上,模式与数据库是同义的,所以

    2023年04月27日
    浏览(41)
  • 【必知必会的MySQL知识】mysql5.7安装教程

    下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载zip免安装版,可以省去很多事 my.ini文件内容如下 以上配置文件说明 basedir--mysql目录 datadir--数据路径 port --端口 skip-grant-tables --刚开始跳过登陆校验 安装服务: 初始化数据库 登陆命令: 最后,我们当然不希望以后写

    2024年02月02日
    浏览(42)
  • 【必知必会的MySQL知识】③DML语言

    目录 前言 准备 插入数据 语法格式 插入完整行数据 插入多行数据 将检索出来的数据插入表 更新数据 准备两张表 语法 实践操作 删除数据 语法 实践操作 小结 前面的两篇文章中,我们已经对MySQL有了基本了解。 并且知道了怎么用工具连接数据库?怎么创建数据库?怎么创建

    2024年02月02日
    浏览(64)
  • 【必知必会的MySQL知识】⑤DQL语言

    目录 一、前言 二、基础查询 2.1 语法 2.2 实践操作 三、条件查询 3.1 语法 3.2 where 语句操作符 3.3 实践操作 四、排序查询 4.1 语法格式 4.2 实践操作 五、分组查询 5.1 语法 5.2 聚集函数 5.2.1 聚集函数简单使用 5.3 实践操作 5.4 规定与小结 六、连接查询(多表查询) 6.1 简介 6.2 笛

    2024年02月02日
    浏览(47)
  • 【必知必会的MySQL知识】④DCL语言

    目录 一、概述 二 、授权 2.1 语法格式 2.2 语法说明 2.3 权限类型 2.4 权限级别 三、 回收权限 3.1 语法格式 3.2 语法说明 3.3 注意事项 四 、实践操作 数据控制语言,用来定义访问权限和安全级别。主要包含包括 grant , revoke grant 授予权限 revoke 回收权限 2.1 语法格式 2.

    2024年02月02日
    浏览(43)
  • 【MySQL】JSON 格式字段处理

    MySQL 5.7 版本后已支持 JSON 格式,这虽是 MySQL 的一小步,但可以说是程序开发的一大步,再也不用将 JSON 内容塞到 VARCHAR  类型字段了,程序设计也会变得更加灵活。网上大多只针对 JSONObject 对象类型,本文也将详解  JSONArray 数组类型。 JSON (JavaScript Object Notation)是一种轻量

    2024年02月12日
    浏览(45)
  • mysql处理json格式的字段,一文搞懂mysql解析json数据

    略。自行百度。 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 MySQL 8.0版本中增加了对JSON类型的索引支持。可以使用CREATE INDEX语句创建JSON类型的索引,提高JSON类型数据的查询效率。 存储JSON文档所需的空间与存储

    2024年02月07日
    浏览(51)
  • 【SQL 必知必会】- 第八课 使用函数处理数据

    目录 函数         函数带来的问题         可移植(portable)         是否应该使用函数? 使用函数         文本处理函数         SOUNDEX 支持         日期和时间处理函数         数值处理函数         函数带来的问题         与几乎所有

    2023年04月10日
    浏览(50)
  • 架构师必知必会系列:物联网数据处理与分析

    作者:禅与计算机程序设计艺术 物联网(IoT)已经成为一个全新的互联网发展模式,它将物理世界、信息网络和人工智能等多种技术融合在一起。随着物联网的广泛应用,传感器、节点设备、云计算平台和应用软件日益壮大。因此,对物联网数据的采集、存储、分析、处理、

    2024年02月06日
    浏览(61)
  • AI架构师必知必会系列:自然语言处理在智能客服中的应用

    作者:禅与计算机程序设计艺术 自然语言处理(Natural Language Processing,NLP)是计算机科学领域的一个重要方向,它利用计算机对文本、语音、图像等高维数据进行自动理解、分析和表达的能力。随着信息化和互联网的飞速发展,越来越多的人从事信息获取、咨询等业务,而智

    2024年02月06日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包