MYSQL中的json数据操作代码
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《MYSQL中的json数据操作代码》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下数据、mysqljson,希望所有认真读完的童鞋们,都有实质性的提高。
MYSQL中的json数据操作
1.2 基础查询操作
用法提示:
- 如果
json字符串不是数组,则直接使用$.字段名 - 如果
json字符串是数组[Array],则直接使用$[对应元素的索引id]
1.2.1 一般json查询
使用json字段名->’$.json属性’进行查询条件,注意:如果 ‘->’ 不能用也可用 ‘->>’ 查询
举个例子:如果想查询deptLeader=张五的数据,那么sql语句如下:
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5';
1.2.2 多个条件查询
比如想查dept为“部门3”和deptLeaderId=5的数据,sql如下:
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5' and json_value->'$.deptId'='5';
1.2.3 json中多个字段关系查询
比如想查询json格式中deptLeader=张五和deptId=5的数据
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5' and json_value->'$.deptId'='5';
1.2.4 关联表查询
这里我们要连表查询在dept 表中部门leader在dept_leader 中的详情
SELECT * from dept,dept_leader WHERE dept.json_value->'$.deptLeaderId'=dept_leader.json_value->'$.id' ;
1.3 JSON函数操作
写到这里大家都发现了,我们查询的json都是整条json数据,这样看起来不是很方便,那么如果我们只想看json中的某个字段怎么办?
1.3.1 官方json函数
| Name | Description | 解释 |
|---|---|---|
| -> | Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT() | 计算路径后返回JSON列的值;相当于JSON_EXTRACT () |
| ->> | Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). | 从JSON列返回值后,就算路径和取消引号的结果;相当于JSON_UNQUOTE (JSON_EXTRACT ()) |
| JSON_ARRAY() | Create JSON array | 创建JSON数组 |
| JSON_ARRAY_APPEND() | Append data to JSON document | 向JSON文档追加数据 |
| JSON_ARRAY_INSERT() | Insert into JSON array | 插入JSON数组 |
| JSON_CONTAINS() | Whether JSON document contains specific object at path | JSON文档是否包含路径上的特定对象 |
| JSON_CONTAINS_PATH() | Whether JSON document contains any data at path | JSON文档是否在路径上包含任何数据 |
| JSON_DEPTH() | Maximum depth of JSON document | JSON文档的最大深度 |
| JSON_EXTRACT() | Return data from JSON document | 从JSON文档返回数据 |
| JSON_INSERT() | Insert data into JSON document | 将数据插入JSON文档 |
| JSON_KEYS() | Array of keys from JSON document | 来自JSON文档的键数组 |
| JSON_LENGTH() | Number of elements in JSON document | JSON文档中的元素数量 |
| JSON_MERGE_PATCH() | Merge JSON documents, replacing values of duplicate keys | 合并JSON文档,替换重复键的值 |
| JSON_MERGE_PRESERVE() | Merge JSON documents, preserving duplicate keys | 合并JSON文档,保留重复的密钥 |
| JSON_OBJECT() | Create JSON object | 创建JSON对象 |
| JSON_OVERLAPS() | Compares two JSON documents, returns TRUE (1) if these have any key-value pairs or array elements in common, otherwise FALSE (0) | 比较两个JSON文档,如果它们有共同的键值对或数组元素,则返回TRUE(1),否则返回FALSE (0) |
| JSON_PRETTY() | Print a JSON document in human-readable format | 以人类可读的格式打印JSON文档 |
| JSON_QUOTE() | Quote JSON document | 引用JSON文档 |
| JSON_REMOVE() | Remove data from JSON document | 从JSON文档中删除数据 |
| JSON_REPLACE() | Replace values in JSON document | 替换JSON文档中的值 |
| JSON_SCHEMA_VALID() | Validate JSON document against JSON schema; returns TRUE/1 if document validates against schema, or FALSE/0 if it does not | 针对JSON模式验证JSON文档;如果文档针对模式进行验证,则返回TRUE/1,否则返回FALSE/0 |
| JSON_SCHEMA_VALIDATION_REPORT() | Validate JSON document against JSON schema; returns report in JSON format on outcome on validation including success or failure and reasons for failure | 针对JSON模式验证JSON文档;以JSON格式返回关于验证结果的报告,包括成功或失败以及失败原因 |
| JSON_SEARCH() | Path to value within JSON document | JSON文档中值的路径 |
| JSON_SET() | Insert data into JSON document | 将数据插入JSON文档 |
| JSON_STORAGE_FREE() | Freed space within binary representation of JSON column value following partial update | 在部分更新后释放JSON列值的二进制表示形式中的空间 |
| JSON_STORAGE_SIZE() | pace used for storage of binary representation of a JSON document | 用于存储JSON文档的二进制表示的空间 |
| JSON_TABLE() | Return data from a JSON expression as a relational table | 以关系表的形式从JSON表达式返回数据 |
| JSON_TYPE() | Type of JSON value | JSON值类型 |
| JSON_UNQUOTE() | Unquote JSON value | 不引用JSON值 |
| JSON_VALID() | Whether JSON value is valid | JSON值是否有效 |
| JSON_VALUE() | Extract value from JSON document at location pointed to by path provided; return this value as VARCHAR(512) or specified type | 根据所提供的路径从JSON文档中所指向的位置提取值;返回该值为VARCHAR(512)或指定的类型 |
| MEMBER OF() | Returns true (1) if first operand matches any element of JSON array passed as second operand, otherwise returns false (0) | 如果第一个操作数匹配作为第二个操作数的JSON数组中的任何元素,则返回true(1),否则返回false (0) |
1.3.2 ->、->>区别
->在field中使用的时候结果带引号,->>的结果不带引号
1.3.2.2 在where条件中使用
特别注意:->当做where查询是要注意类型的,->>是不用注意类型的
1.3.3 json_extract():从json中返回想要的字段
用法:json_extract(字段名,$.json字段名)
select id,json_extract(json_value,'$.deptName') as deptName from dept;
1.3.4 JSON_CONTAINS():JSON格式数据是否在字段中包含特定对象
用法: JSON_CONTAINS(target, candidate[, path])
事例:如果我们想查询包含deptName=部门5的对象
select * from dept WHERE JSON_CONTAINS(json_value, JSON_OBJECT("deptName","部门5"))
1.3.5 SON_OBJECT():将一个键值对列表转换成json对象
比如我们想查询某个对象里面的值等于多少
比如我们添加这么一组数据到dept表中:
insert into dept VALUES(6,'部门9','{"deptName": {"dept":"de","depp":"dd"}, "deptId": "5", "deptLeaderId": "5"}');
我们可以看到deptName中还有一个对象,里面还有dept和depp两个属性字段,那么我们应该怎么查询depp=dd的员工呢。
用法:JSON_OBJECT([key, val[, key, val] …])
事例:
SELECT * from (
SELECT *,json_value->'$.deptName' as deptName FROM dept
) t WHERE JSON_CONTAINS(deptName,JSON_OBJECT("depp","dd"));
1.3.6 JSON_ARRAY():创建JSON数组
比如我们添加这么一组数据到dept表中:
insert into dept VALUES(7,'部门9','{"deptName": ["1","2","3"], "deptId": "5", "deptLeaderId": "5"}');
insert into dept VALUES(7,'部门9','{"deptName": ["5","6","7"], "deptId": "5", "deptLeaderId": "5"}');
用法:JSON_ARRAY([val[, val] …])
事例:我们要查询deptName包含1的数据
SELECT * from dept WHERE JSON_CONTAINS(json_value->'$.deptName',JSON_ARRAY("1"))
1.3.7 JSON_TYPE():查询某个json字段属性类型
用法:JSON_TYPE(json_val)
事例:比如我们想查询deptName的字段属性是什么
SELECT json_value->'$.deptName' ,JSON_TYPE(json_value->'$.deptName') as type from dept
1.3.8 JSON_KEYS():JSON文档中的键数组
用法:JSON_KEYS(json_value)
事例:比如我们想查询json格式数据中的所有key
SELECT JSON_KEYS(json_value) FROM dept
接下来的3种函数都是新增数据类型的:
JSON_SET(json_doc, path, val[, path, val] …)
JSON_INSERT(json_doc, path, val[, path, val] …)
JSON_REPLACE(json_doc, path, val[, path, val] …)1.3.9 JSON_SET():将数据插入JSON格式中,有key则替换,无key则新增
这也是我们开发过程中经常会用到的一个函数
用法:JSON_SET(json_doc, path, val[, path, val] …)
事例:比如我们想针对id=2的数据新增一组:newData:新增的数据,修改deptName为新增的部门1
sql语句如下:
update dept set json_value=JSON_SET('{"deptName": "部门2", "deptId": "2", "deptLeaderId": "4"}','$.deptName','新增的部门1','$.newData','新增的数据') WHERE id=2;
注意:json_doc如果不带这个单元格之前的值,之前的值是会新值被覆盖的,比如我们如果更新的语句换成:
update dept set json_value=JSON_SET('{"a":"1","b":"2"}','$.deptName','新增的部门1','$.newData','新增的数据') WHERE id=2我们可以看到这里json_doc是{“a”:“1”,“b”:“2”},这样的话会把之前的单元格值覆盖后再新增/覆盖这个单元格字段
1.3.10 JSON_INSERT():插入值(往json中插入新值,但不替换已经存在的旧值)
用法:JSON_INSERT(json_doc, path, val[, path, val] …)
事例:
UPDATE dept set json_value=JSON_INSERT('{"a": "1", "b": "2"}', '$.deptName', '新增的部门2','$.newData2','新增的数据2')
WHERE id=2
我们可以看到由于json_doc变化将之前的值覆盖了,新增了deptName和newData2.
如果我们再执行以下刚才的那个sql,只是换了value,我们会看到里面的key值不会发生变化。
因为这个函数只负责往json中插入新值,但不替换已经存在的旧值。
1.3.11 JSON_REPLACE()
用法:JSON_REPLACE(json_doc, path, val[, path, val] …)
用例:
如果我们要更新id=2数据中newData2的值为:更新的数据2
sql语句如下:
UPDATE dept set json_value=JSON_REPLACE('{"a": "1", "b": "2", "deptName": "新增的部门2", "newData2": "新增的数据2"}', '$.newData2', '更新的数据2') WHERE id =2;
1.3.12 JSON_REMOVE():从JSON文档中删除数据
用法:JSON_REMOVE(json_doc, path[, path] …)
举例:删除key为a的字段。
UPDATE dept set json_value=JSON_REMOVE('{"a": "1", "b": "2", "deptName": "新增的部门2", "newData2": "更新的数据2"}','$.a') WHERE id =2;
文中关于mysql的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《MYSQL中的json数据操作代码》文章吧,也可关注golang学习网公众号了解相关技术文章。
一文搞懂什么是MySQL前缀索引
- 上一篇
- 一文搞懂什么是MySQL前缀索引
- 下一篇
- vs如何读取mysql中的数据并解决中文乱码问题
-
- 数据库 · MySQL | 1天前 |
- MySQL 8.4 隐藏索引怎么试:不删索引也能验证查询计划
- 133浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 501浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 数据库设计 · 索引优化 · mysql UUID_TO_BIN BIN_TO_UUID swap_flag 二进制UUID
- MySQL UUID_TO_BIN 如何保持时间有序:swap_flag 与 BIN_TO_UUID 还原边界
- 261浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL 隐形列怎么兼容 SELECT *:INVISIBLE COLUMN 的灰度加字段方法
- 122浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL 分页越翻越慢怎么改:从深分页到覆盖索引的一个列表接口
- 475浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 索引 · 数据库 · 运维 · mysql lock ALTER TABLE ALGORITHM metadata lock
- MySQL 大表新增索引如何降低阻塞:在线变更算法、锁窗口与回滚检查
- 224浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 主从复制 · 运维排障 · MySQL 8.4 replicate-wild-do-table 复制过滤
- MySQL 8.4 复制过滤为何漏掉目标表:replicate-wild-do-table、库名匹配与配置验收
- 405浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 递归 · SQL查询 · 故障排查 · CTE · WITH RECURSIVE cte_max_recursion_depth MySQL CTE 递归查询 递归成员
- MySQL CTE 递归查询为什么会提前停止:锚点、递归成员与 cte_max_recursion_depth
- 438浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 48次使用
-
- Gradio
- Gradio是一个用于构建机器学习和数据科学Web应用的开源Python库。支持快速创建交互界面,获Google、Meta等大厂青睐,适合模型演示、部署反馈及调试。
- 46次使用
-
- AutoGPT
- AutoGPT是基于GPT-4的开源AI代理平台,拥有超10万GitHub星标。本文介绍其低代码界面、自动化工作流功能、系统配置要求及安装步骤,助您高效部署和管理AI Agent。
- 48次使用
-
- 腾讯扣叮
- 腾讯扣叮是腾讯推出的6-18岁青少年编程学习平台,依托游戏与AI技术,提供图形化编程、3D创作、虚拟实验室及丰富赛事课程,助力培养计算思维与创新能力。
- 45次使用
-
- 堆友AI学习
- 堆友AI学习是堆友推出的专业AI设计教育平台,提供从基础到进阶的线上课程及线下实训营。结合阿里国际AITIC认证,通过视频教程、笔记分享和实战案例,帮助设计师掌握AIGC技能,提升职业竞争力。
- 46次使用
-
- Golang中map数据类型的使用方法
- 2022-12-30 443浏览
-
- 一文详解Golang中的切片数据类型
- 2022-12-31 171浏览
-
- Go 编程复杂数据类型 Map
- 2023-01-01 306浏览
-
- Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结
- 2022-12-28 264浏览
-
- Go语言中的数据竞争模式详解
- 2023-01-01 456浏览

