MySQL 操作 JSON 数据类型
MySQL 从 v5.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_ARRAY 和 JSON_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_PATCH 和 JSON_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_EXTRACT 和 JSON_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参数指定的命令,…...
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? 用过计算机的人知道,我只要点点鼠标计算机就能按照我们的要求来进行相应的操作,那么,你有没有想过计算机为什么能够识别我们的操作呢?俗话说,人有人语,机有机…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
