深入了解 MySQL 中的 JSON_CONTAINS
深入了解 MySQL 中的 JSON_CONTAINS
MySQL 5.7 及更高版本引入了对 JSON 数据类型的支持,使得在数据库中存储和查询 JSON 数据成为可能。在这些新功能中,JSON_CONTAINS
函数是一个非常有用的工具,允许我们检查一个 JSON 文档是否包含特定的值或对象。本文将深入探讨 JSON_CONTAINS
的用法、语法、示例及其应用场景。
1. JSON_CONTAINS 函数的概述
JSON_CONTAINS
函数用于检查一个 JSON 文档中是否包含另一个 JSON 文档。它的语法如下:
JSON_CONTAINS(target, candidate[, path])
- target: 目标 JSON 文档,即我们要检查的文档。
- candidate: 候选 JSON 文档,即我们要查找的值或对象。
- path: 可选参数,指定一个 JSON 路径,用于查找特定的节点。
2. 基本用法
2.1 检查简单值
假设我们有一个存储用户信息的表 users
,其中有一个 JSON 列 preferences
,结构如下:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),preferences JSON
);
插入一些示例数据:
INSERT INTO users (name, preferences) VALUES
('Alice', '{"theme": "dark", "notifications": true}'),
('Bob', '{"theme": "light", "notifications": false}'),
('Charlie', '{"theme": "dark"}');
我们可以使用 JSON_CONTAINS
来检查哪些用户的偏好设置中包含某个特定值。例如,查找所有偏好设置中包含 “dark” 主题的用户:
SELECT name
FROM users
WHERE JSON_CONTAINS(preferences, '"dark"', '$.theme');
在这个查询中,我们检查 preferences
中的 theme
字段是否包含值 "dark"
。
2.2 检查嵌套对象
如果 JSON 文档中包含嵌套结构,JSON_CONTAINS
仍然可以有效地使用。假设我们更新 preferences
列,添加更多复杂的结构:
UPDATE users SET preferences = '{"ui": {"theme": "dark", "font": "Arial"}, "notifications": true} WHERE name = "Alice";
我们现在想检查 Alice 的偏好设置是否包含 {"theme": "dark"}
这个对象:
SELECT name
FROM users
WHERE JSON_CONTAINS(preferences, '{"theme": "dark"}', '$.ui');
3. 实际应用场景
3.1 过滤用户数据
在实际应用中,JSON_CONTAINS
可以用于根据用户的偏好设置来过滤用户。例如,显示所有启用了通知的用户:
SELECT name
FROM users
WHERE JSON_CONTAINS(preferences, 'true', '$.notifications');
3.2 多条件查询
如果我们想要查找所有既使用 “dark” 主题又启用了通知的用户,可以结合使用 JSON_CONTAINS
和 AND
条件:
SELECT name
FROM users
WHERE JSON_CONTAINS(preferences, '"dark"', '$.ui.theme')
AND JSON_CONTAINS(preferences, 'true', '$.notifications');
3.3 与其他 JSON 函数结合使用
JSON_CONTAINS
还可以与其他 JSON 函数结合使用,例如 JSON_ARRAY
, JSON_OBJECT
等,来创建更复杂的查询。例如,我们可以检查用户偏好设置中的多个主题:
SELECT name
FROM users
WHERE JSON_CONTAINS(preferences, '["dark", "light"]', '$.ui.theme');
4. 性能考虑
使用 JSON 数据类型和函数时,性能是一个需要考虑的关键因素。虽然 JSON 为灵活的数据存储提供了优势,但过多的嵌套和复杂结构可能会导致查询性能下降。因此,在设计 JSON 数据结构时,应考虑到可能的查询方式和数据访问模式。
5. 总结
JSON_CONTAINS
是 MySQL 提供的一个强大工具,可以在 JSON 数据中快速查找和匹配特定的值或对象。通过灵活地使用这项功能,可以极大地增强应用程序的数据处理能力和灵活性。随着应用场景的不断扩展,理解和利用 MySQL 中的 JSON 功能将变得愈发重要。
希望本文能帮助你更好地理解和应用 MySQL 中的 JSON_CONTAINS
函数!
参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-contains
相关文章:
深入了解 MySQL 中的 JSON_CONTAINS
深入了解 MySQL 中的 JSON_CONTAINS MySQL 5.7 及更高版本引入了对 JSON 数据类型的支持,使得在数据库中存储和查询 JSON 数据成为可能。在这些新功能中,JSON_CONTAINS 函数是一个非常有用的工具,允许我们检查一个 JSON 文档是否包含特定的值…...

宝藏推荐:精选十款知识库搭建软件
当今这个信息爆炸的时代,高效地管理和利用知识成为了各行各业追求的目标。无论是企业内部的协作,还是对外提供的信息服务,一个强大的知识库都是不可或缺的。为了帮助大家更好地守护和利用知识宝藏,以下是精选的十款知识库搭建软件…...
go语言接口设计三国人物
题目 请设计一个接口Person,然后设计两个结构体实现Person接口,这两个结构体都代表三国时代的名人。Person接口中有一个方法,该方法输出一句最能代表该人物特点的话。 程序 package main import ("fmt") type Person interface …...

day-63 优质数对的总数 II
思路 nums1[i] 可以被 nums2[j] * k 整除,所以nums[i]/k的所有因子都符合条件,问题转换为遍历nums1,统计nums[i]/k的因子出现次数,然后遍历nums2,如果nums2[i]是某一个因子,将其出现次数加入答案中即可 解题过程 利用哈希表统计出…...

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)
文章目录 一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据 3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa …...

C++ | Leetcode C++题解之第461题汉明距离
题目: 题解: class Solution { public:int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s) {s & s - 1;ret;}return ret;} };...

ElasticSearch备考 -- Update by query Reindex
一、题目 有个索引task,里面的文档长这样 现在需要添加一个字段all,这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起,组成一个新的字段,这个就需要脚本, 这里有两种方案ÿ…...

从认识String类,到走进String类的世界
作为一个常用的数据类型,跟随小编一同进入String的学习吧,领略String的一些用法。 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 一:…...

Vue入门-指令修饰符-@keyup.enter
指令修饰符: 通过"."指明一些指令后缀,不同后缀封装了不同的处理操作 ->简化代码 ①按键修饰符 keyup.enter ->键盘回车监听 ".enter"if(e.keyenter){} //".enter"用来简化代码 demo: <!DOCTYPE…...

【Kubernetes】常见面试题汇总(五十九)
目录 129.问题:pod 使用 PV 后,无法访问其内容? 130.查看节点状态失败? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二…...

【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤
【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤 文章目录 开发环境驱动开发(以字符设备为例)安装驱动应用程序开发附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 开发环境 首先需要交叉编译器和Linux环境…...
SpinalHDL之设计错误(Design Errors)(一)
本文作为SpinalHDL学习笔记第七十四篇,介绍SpinalHDL的设计错误。 目录: 1.赋值覆盖(Assignment Overlap) 2.跨时钟域违例(Clock crossing violation) 3.组合环(Combinatorial loop) 4.层次违例(Hierarchy violation) 5.IO包 ⼀、赋值覆盖(Assignment Overlap) ⼀、简介…...
QT + opengl 让2d贴图动起来
1 qtopengl 实现纹理贴图,平移旋转,绘制三角形,方形-CSDN博客 在上篇文章里面我已经学会了给贴图,并且旋转,那我们如何动态的显示2D的图片呢,那我们在qt里面是如何实现呢,定时器连续更新。 上…...
【selenium】webdriver测试脚本
【背景】 不同电脑上运行selenium时总是因为环境问题出幺蛾子,所以需要一个最简单的脚本每次先验证一下能不能正常启用selenium。 【脚本】 这个脚本做的事情就是试着用selenium启动网页,默认用了百度首页,也可以根据情况自己修改。 from…...
工业自动化中的关键信号:开关量、模拟量与脉冲量
工业自动化和控制系统中,信号的类型对于数据处理和决策至关重要。主要的信号类型包括开关量、模拟量和脉冲量。每种信号类型都有其独特的特点和应用场景,它们共同构成了自动化系统的基础。这三种信号的特点、应用及其在现代工业自动化中的重要性。 开关…...

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题
VMware vCenter Server 8.0U3c 发布下载 - 集中式管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接:https://sysin.org/blog/vmware-vcenter-8-u3/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VMw…...

Java面试宝典-Java集合02
目录 Java面试宝典-Java集合02 21、TreeMap 和 TreeSet 在排序时如何比较元素? 22、ArrayList 和 LinkedList 的区别是什么? 23、ArrayList 和 Vector 的区别? 24、队列和栈是什么?有什么区别? 25、Queue和Deque的区别…...
HJ212-2017协议详解:工业物联网环境监测标准简单了解
在工业物联网(IIoT)领域,环境数据的采集、传输和分析对于环境监控和治理至关重要。中国环境监测系统中,HJ212-2017协议是针对污染源在线监控(监测)系统的通信协议标准。该协议规定了污染源自动监控设备与数…...

【Golang】Go语言Seeker接口与文件断点续传实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

【MySQL】基本查询(下):更新、删除
3.Update 语法: UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]举几个例子: 将孙悟空同学的数学成绩变更为 80 分: 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 …...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...