当前位置: 首页 > news >正文

MySQL 操作 JSON 数据类型

MySQLv5.7.8 开始支持 JSON 数据类型。

JSON 数据类型和传统数据类型的操作还是有很大的差别,需要单独学习掌握。好在 JSON 数据类型的学习成本不算太高,只是在 SQL 语句中扩展了 JSON 函数,操作 JSON 数据类型主要是对函数的学习。

新建数据库

CREATE TABLE t(id INT, data json, PRIMARY KEY (id));

插入数据

新增 JSON 文档

函数描述
JSON_ARRAY创建 JSON 数组
JSON_OBJECT创建 JSON 对象

插入数据可以通过字符串的方式直接插入或者用 JSON_ARRAYJSON_OBJECT 函数来构造数据。

插入数组

INSERT INTO t (id, data) VALUES (1, '[1, 2, 3]');
INSERT INTO t (id, data) VALUES (2, JSON_ARRAY(1, 2, 3));

插入对象

INSERT INTO t (id, data) VALUES (3, '{"a": 1, "b": 2}');
INSERT INTO t (id, data) VALUES (4, JSON_OBJECT("a", 1, "b", 2, "c", 3));
INSERT INTO t (id, data) VALUES (5, '{"a": "abc", "b": {"c": "dad"}, "c": {"b": "aaa"}}');

修改数据

修改 JSON 文档

函数描述
JSON_SET当 Key 存在时修改,当 Key 不存在时新增
JSON_INSERT当 Key 不存在时新增,当 Key 存在时不做任何变动
JSON_REPLACE当 Key 存在时更新,当 Key 不存在时不做任何变动
JSON_ARRAY_INSERT在数组末尾处追加新元素
JSON_ARRAY_APPEND在数组指定下标处插入新元素
JSON_MERGE_PATCH合并 JSON 数组或对象
JSON_MERGE_PRESERVE合并 JSON 数组或对象

JSON_SET$ 表示整个 JSON 文档,通过指定对象属性或数组下标的方式修改数据,当 key 存在时修改反之则新增。

UPDATE t SET data = '[1, 20, 30]' WHERE id = 1;
UPDATE t SET data = JSON_SET(data, '$.c', 30, '$.d', 40) WHERE id = 4;
UPDATE t SET data = JSON_INSERT(data, '$.c', 3) WHERE id = 4;
UPDATE t SET data = JSON_REPLACE(data, '$.c', 3) WHERE id = 4;
UPDATE t SET data = JSON_ARRAY_INSERT(data, '$[0]', 0) WHERE id = 1;
UPDATE t SET data = JSON_ARRAY_APPEND(data, '$', 4) WHERE id = 1;

JSON_MERGE_PATCHJSON_MERGE_PRESERVE 都对 JSON 数组或对象进行合并操作,二者用法相同只是合并逻辑有所不同,具体的详情和细节可在文末参考链接中寻找。

删除数据

删除 JSON 文档

函数描述
JSON_REMOVE当 Key 存在时删除,当 Key 不存在时不做任何变动
UPDATE t SET data = JSON_REMOVE(data, '$.c', '$.d') WHERE id = 4;

查询数据

查询 JSON 文档

函数描述
JSON_CONTAINS判断源数据是否包含某个 JSON 数组或对象,包含返回 1, 否则返回 0
JSON_CONTAINS_PATH判断源数据某个路径下是否包含某个 JSON 数组或对象,包含返回 1, 否则返回 0
JSON_SEARCH指定关键字搜索 JSON 数组或对象,可以限制查找范围条件,支持 %、_、*、** 通配符,结果返回为 JSON 值的路径
SELECT JSON_CONTAINS(data, '{"b": 2}') FROM t WHERE id = 3;  // 1
SELECT JSON_CONTAINS(data, '{"c": 3}') FROM t WHERE id = 3;  // 0

第二个参数是控制返回数据的条数,参数如果是 one 只返回一条,参数如果是 all 则返回全部。

SELECT JSON_CONTAINS_PATH(data, 'one', '$.b', '$.c') FROM t WHERE id = 3;  // 1
SELECT JSON_CONTAINS_PATH(data, 'all', '$.b', '$.c') FROM t WHERE id = 3;  // 0

LIKE 一样,在字符串关键字的通过用 %_ 在所有节点的值中匹配。

SELECT JSON_SEARCH(data, 'one', '%a%') FROM t WHERE id = 5;  // $.a
SELECT JSON_SEARCH(data, 'all', '%a%') FROM t WHERE id = 5;  // ["$.a", "$.b.c", "$.c.b"]

还可以对条件限制查找范围。

SELECT JSON_SEARCH(data, 'all', '%a%', NULL, '$.b') FROM t WHERE id = 5;  // "$.b.c"

查找范围还可使用通配符,** 是递归匹配所有节点下的值。

SELECT JSON_SEARCH(data, 'all', '%a%', NULL, '$**.b') FROM t WHERE id = 5;  // ["$.b.c", "$.c.b"]

在实际开发中,一般 JSON_SEARCH 用的是最多的,而且大部分情况是作为搜索条件出现的,例如:

SELECT * FROM `templates_data` WHERE `template_id`=4 AND data -> '$**.value' LIKE '%内蒙古%'
SELECT * FROM `templates_data` WHERE `template_id`=4 AND JSON_SEARCH(data, 'all', '%内蒙古%', null, '$**.value')
SELECT * FROM `templates_data` WHERE `template_id`=4 AND JSON_CONTAINS(data, JSON_OBJECT('value', '内蒙古'))

**注意:**只有 JSON_EXTRACTJSON_SEARCH 中的 path 才支持通配符。

操作文档

操作 JSON 文档

函数描述
JSON_QUOTE将 String 类型转成 JSON 类型
JSON_UNQUOTE将 JSON 类型转成 String 类型
JSON_KEYS以数组的方式返回 JSON 文档中的 Key
JSON_EXTRACT以字符串或数组的方式返回 JSON 文档中的 Value,支持通配符
JSON_LENGTH返回 JSON 文档的长度
JSON_DEPTH返回 JSON 文档的最大深度
JSON_TYPE返回 JSON 文档值的类型
JSON_VALID判断 JSON 文档是否合法
SELECT JSON_QUOTE('{"a": 1, "b": 2, "c": 3}');          // "{\"a\": 1, \"b\": 2, \"c\": 3}"
SELECT JSON_UNQUOTE('{"a": 1, "b": 2, "c": 3}');        // {"a": 1, "b": 2, "c": 3}
SELECT JSON_KEYS('{"a": 1, "b": 2, "c": 3}');           // ["a", "b", "c"]
SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": 3}', '$.b'); // 2
SELECT JSON_LENGTH('{"a": 1, "b": 2, "c": 3}', '$.b');  // 1
SELECT JSON_DEPTH('{"a": 1, "b": 2, "c": 3}');          // 2
SELECT JSON_TYPE('{"a": 1, "b": 2, "c": 3}');           // OBJECT
SELECT JSON_VALID('{"a": 1, "b": 2, "c": 3}');          // 1

参考链接:
https://www.sjkjc.com/mysql-ref/json_array/
https://www.cnblogs.com/xyj179/p/11451593.html

相关文章:

MySQL 操作 JSON 数据类型

MySQL 从 v5.7.8 开始支持 JSON 数据类型。 JSON 数据类型和传统数据类型的操作还是有很大的差别,需要单独学习掌握。好在 JSON 数据类型的学习成本不算太高,只是在 SQL 语句中扩展了 JSON 函数,操作 JSON 数据类型主要是对函数的学习。 新…...

关于vue3生命周期的使用、了解以及用途(详细版)

生命周期目录前言组合式写法没有 beforeCreate / created 生命周期,并且组合式写生命周期用哪个先引哪个beforeCreatecreatedbeforeMount/onBeforeMountmounted/onMountedbeforeUpdate/onBeforeUpdateupdated/onUpdatedbeforeUnmount/onBeforeUnmountunmounted/onUn…...

2月,真的不要跳槽。

新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…...

Vulnhub靶场----4、DC-4

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-4下载地址:https://download.vulnhub.com/dc/DC-4.zip kali:192.168.144.148 DC-4:192.168.144.152 二、渗透流程 端口扫描:nmap -T5 -p- -sV -sT -A 192.168.144.1…...

51单片机学习笔记_12 LCD1602 原理及其模块化代码

LCD1602 liquid crystal display 液晶显示屏,一种字符型液晶显示模块,可以显示 16*2 个字符,每个字符是 5*7 点阵。 P0 P2 会和数码管、LED 一定程度上冲突。 地。 Vcc。 调对比度的。 RS:数据指令端。1代表 DB 是数据&#x…...

科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今

恍惚之间,ChatGPT红遍全网,元宇宙沉入深海…… 在科技圈,见证了太多“昙花一现”,“新贵” ChatGPT 的爆火几乎复制了元宇宙的路径,它会步元宇宙的后尘,成为下一个沉入深海的工具吗? 不可否认的…...

redis基本入门| 怎么安装redis?什么的是redis?怎么使用?

目录 一、Redis下载与安装 二、基本概念 1.什么是Redis? 2.Redis端口多少? 3.Redis是单线程还是多线程? 4.Redis为什么单线程还这么快? 三、Redis的基本操作 四、Redis的五个基本类型 1.Redis-key 2.字符串 string 3.列表 list …...

kubernetes traefik ingress 安装部署以及使用和注意点

1、简介 Traefik 是一款 open-source 边缘路由器,可让您轻松地发布服务. 它接收来自您的系统请求,并找出负责处理它们的后端服务组件。 traefik 与众不同在于它能够自动发现适合您服务的配置。 当 Traefik 检查您的基础设施时,它会发现相关信…...

电脑病毒已灭绝,是真的吗?

大家有没有这样一个疑问,觉得自己的电脑好像很久没有电脑病毒了?之前大名鼎鼎的蠕虫2000,熊猫烧香都变得不那么常见了。到底是电脑因为自身优化和杀毒软件的防护导致病毒变少了,还是本身电脑病毒变少了呢?(…...

基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计(二)

rk3399 是由本土芯片厂商瑞芯微(Rockchip)研发的高性能、低功耗“中国芯”。在 2016 年 4 月,rk3399 首次在香港举行的电子展上亮相。芯片使用六核大 LITTLE 处理器: 包括四核的 Cortex-A53 和双核的 Cortex-A72,主频可…...

追梦之旅【数据结构篇】——详解C语言实现动态版顺序栈

详解C语言动态实现顺序栈~😎前言🙌预备小知识💞栈的概念及结构整体实现内容分析💞1.头文件编码实现🙌2.功能文件编码实现🙌3.测试文件的编写:🙌总结撒花💞😎博…...

Ubuntu 使用Nohup 部署/启动/关闭程序

目录 一、什么是nohup? 二、nohup能做什么? 三、nohup如何使用? 四、怎么查看/关闭使用nohup运行的程序? 命令 实例 一、什么是nohup? nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令&#xff0c…...

Spring 用到了哪些设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。1. 策略模式关于策略模式的使用方式,在Spring中其实比较简单,…...

Linux上基于PID找到对应的进程名以及所在目录

Linux上基于PID找到对应的进程名以及所在目录前言找到进程的pid通过top命令查看通过 ps -ef |grep nignx进行查看通过端口号进行查看查看nginx进程目录前言 在一台新接触的服务器,却不熟悉搭建所在目录的时候,这时候就就可以通过ps查找进程,并…...

jvm知识点与面试题

jvm 1. 定义:Java虚拟机(Java virtual machine),一种能够运行Java字节码的虚拟机。 1.1. Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 2. jvm基本结构: 2.1. 1 类加载…...

算法前缀和—Java版

前缀和概念 假设有数组 A[1,2,3,4,5,6,7] 为原数组,有数组 B作为A的前缀和数组,那么B[1,3,6,10,15,21,28];可以发现B[i] A[0]....A[i],即B[i]是数组A的前面i个数的总和。可以前缀和表示如下公式: B[i]∑j0iA[j]B[i]\s…...

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性,就好像我们在做股票投资的时候,提到最多的就是周期规律,因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…...

浅谈常用的日志框架

文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以…...

字节是真的难进,测开4面终上岸,压抑5个月,终于可以放声呐喊

这次字节的面试,给我的感触很深,意识到基础的重要性。一共经历了五轮面试:技术4面+HR面。 下面看正文 本人自动专业毕业,压抑了五个多月,终于鼓起勇气,去字节面试,下面是我的面试过…...

Bash初识

Bash初识 1.简介: 一.什么是shell? 用过计算机的人知道,我只要点点鼠标计算机就能按照我们的要求来进行相应的操作,那么,你有没有想过计算机为什么能够识别我们的操作呢?俗话说,人有人语,机有机…...

基于Hunyuan-MT-7B的算法竞赛题解翻译系统

基于Hunyuan-MT-7B的算法竞赛题解翻译系统 1. 引言 算法竞赛是全球程序员和算法爱好者展示实力的舞台,但语言障碍常常成为知识共享的壁垒。一道优秀的解题思路,可能因为语言不通而无法被更多人学习借鉴。传统的机器翻译工具在面对算法题解中的专业术语…...

大语言模型训练中的显存占用与优化方法简述

在进行大语言模型(LLM)的微调或预训练时,显存(VRAM)不足通常是首要面临的问题。为了在有限的硬件资源下完成训练,了解显存的具体去向以及相应的优化技术是比较基础的工作。 从模型训练的流程来看&#xff…...

终极Ghidra安装指南:5分钟在Ubuntu系统快速部署逆向工程神器

终极Ghidra安装指南:5分钟在Ubuntu系统快速部署逆向工程神器 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 想要…...

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图 1. 产品核心能力介绍 LongCat-Image-Edit是美团LongCat团队推出的开源图像编辑模型,它让复杂的图片编辑变得像说话一样简单。这个模型有三大杀手锏: 一句话精准编…...

SEO_2024年最新SEO策略与趋势深度解析(352 )

<h2>2024年最新SEO策略与趋势深度解析</h2> <p>在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;依然是网站流量和品牌影响力的核心驱动力。2024年&#xff0c;随着互联网技术的不断进步&#xff0c;SEO策略和趋势也在不断演变。本文将详细…...

黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统

黑丝空姐-造相Z-Turbo实战项目&#xff1a;数据库课程设计之AI图库管理系统 最近在带学生做数据库课程设计&#xff0c;发现一个挺有意思的现象&#xff1a;很多同学觉得数据库设计就是建几张表&#xff0c;写几个查询&#xff0c;做完就完了&#xff0c;跟实际应用脱节挺大的…...

OpenClaw多模态飞书助手:Qwen3-VL:30B实战详解

OpenClaw多模态飞书助手&#xff1a;Qwen3-VL:30B实战详解 1. 为什么需要多模态飞书助手&#xff1f; 去年夏天&#xff0c;我负责一个跨部门协作项目时&#xff0c;每天要处理上百条飞书消息。最头疼的是同事发来的各种截图——有的是数据报表需要整理&#xff0c;有的是会议…...

深入OpenBMC散热控制:从IPMI命令到D-Bus,揭秘手动与自动模式切换

深入OpenBMC散热控制&#xff1a;从IPMI命令到D-Bus&#xff0c;揭秘手动与自动模式切换 在数据中心和服务器运维领域&#xff0c;散热控制一直是系统稳定性的关键因素。OpenBMC作为开源基板管理控制器&#xff0c;其散热管理机制直接影响到服务器的可靠性和能效比。本文将带您…...

语义分割实战:如何用Python快速计算mIoU和mAcc(附完整代码)

语义分割实战&#xff1a;Python高效计算mIoU与mAcc的工程化实现 在计算机视觉领域&#xff0c;语义分割模型的性能评估离不开mIoU&#xff08;平均交并比&#xff09;和mAcc&#xff08;平均准确率&#xff09;这两个核心指标。许多教程停留在理论公式层面&#xff0c;而实际项…...

终极对比指南:Autoenv vs 其他环境管理工具,如何选择最适合你的目录环境自动化方案

终极对比指南&#xff1a;Autoenv vs 其他环境管理工具&#xff0c;如何选择最适合你的目录环境自动化方案 【免费下载链接】autoenv Directory-based environments. 项目地址: https://gitcode.com/gh_mirrors/au/autoenv Autoenv是一款强大的目录环境自动化工具&#…...