MySQL数据库基础:JSON函数各类操作一文详解

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL数据库基础:JSON函数各类操作一文详解

前言


很多日常业务场景都会用到json文件作为数据存储起来,而mysql5.7以上就提供了存储json的支撑。往常存储json一般都保留在pg库或者是hive库里面,现在mysql有了支持的话基本业务都可以用mysql来实现。现在mysql8.x版本对json字符出处理已经做的非常完善了。现在就让我们来详细了解一下关于json数据数据类型mysql都有哪些函数能够对其进行操作。


该系列文章将按照这个脉络行文,此系列文章将被纳入我的专栏一文速学SQL各类数据库操作,基本覆盖到使用SQL处理日常业务以及常规的查询建库分析以及复杂操作方方面面的问题。从基础的建库建表逐步入门到处理各类数据库复杂操作,以及专业的SQL常用函数讲解都花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


一、JSON语法规则



首先我们还是先复习一遍json数据类型的语法规则,这在我的很多文章都有写到:


JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。


JSON是一个序列化的对象或数组。


数据为  键 / 值 (name/value)对;

数据由逗号(,)分隔;

大括号保存对象(object);

方括号保存数组(Array);

值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。


如:


"code":"100"


对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成:


{“code”:20,"type":"mysql"}


数组是由方括号括起来的一组值构成:


"datesource":[

   {"code":"20", "type":"mysql"},

  {"code":"20", "type":"mysql"},

   {"code":"20", "type":"mysql"}

]


复习完毕之后我们再来对mysql处理json函数实验。


二、JSON函数


首先我们创建一个表来进行操作:

create TABLE json_test(
  id int not null primary key auto_increment,
  content json
  );

接下来,向test_json数据表中插入数据。

insert into json_test(content) values('{"name":"fanstuck","age":23,"address":{"province":"zhejiang","city":"hangzhou"}}')

可以使用“->”和“->>”查询JSON数据中指定的内容。

SELECT content->'$.name' FROM json_test where id =1;

c4bd36855a5246caa726601be3f7f812.png

SELECT content->>'$.address.city' FROM json_test where id =1;

4354576f22c54a53981294171cd00142.png


1.JSON_CONTAINS(json_doc,value)函数


JSON_CONTAINS(json_doc,value)函数查询JSON类型的字段中是否包含value数据。如果包含则返回1,否则返回0。其中,json_doc为JSON类型的数据,value为要查找的数据。


SELECT JSON_CONTAINS(content, '{"name":"fanstuck"}') FROM json_test ;    


860a78cbd90f4e939b8fbb2422faf931.png


注意:value必须是一个JSON字符串。


2.JSON_SEARCH(json_doc ->> '$[*].key',type,value)函数



JSON_SEARCH(json_doc ->> '$[*].key',type,value)函数在JSON类型的字段指定的key中,查找字符串value。如果找到value值,则返回索引数据。


注意:函数的第二个参数type,取值可以是one或者all。当取值为one时,如果找到value值,则返回value值的第一个索引数据;当取值为all时,如果找到value值,则返回value值的所有索引数据。


SELECT JSON_SEARCH(content ->> '$.address', 'one', 'zhejiang') FROM json_test ;

bd989c639c7a4264afc8d8a46b7ecda7.png

SELECT JSON_SEARCH(content ->> '$.address', 'all', 'nanchang') FROM json_test ;

2f33b2721a51464f856bcde3fabd5b24.png


3.JSON_PRETTY(json_doc)函数


JSON_PRETTY(json_doc)函数以标准的格式显示JSON数据。


SELECT JSON_PRETTY(content) FROM json_test ;


e09cf5009577442ab5dd65ba5b6f8fe5.png


4.JSON_DEPTH(json_doc)函数


JSON_DEPTH(json_doc)函数返回JSON数据的最大深度。


SELECT JSON_DEPTH(content) FROM json_test;

ee64b8ca7458465ea11d6ba9d31951cd.png


5.JSON_LENGTH(json_doc[,path])函数


JSON_LENGTH(json_doc[,path])函数返回JSON数据的长度。


SELECT JSON_LENGTH(content) FROM json_test;

 

402e3e6951df4e82bdd8f6a6631fd0c0.png


6.JSON_KEYS(json_doc[,path])函数


JSON_KEYS(json_doc[,path])函数返回JSON数据中顶层key组成的JSON数组。


SELECT JSON_KEYS(content) FROM json_test;

8e28a60d1677415baf573eea5050bbd0.png

7. JSON_INSERT(json_doc,path,val[,path,val] ...)函数


JSON_INSERT(json_doc,path,val[,path,val] ...)函数用于向JSON数据中插入数据。


{"age": 23, "name": "fanstuck", "address": {"ip": "192.168.12.12", "city": "hangzhou", "province": "z


70a3da699d164ca2a7a6e7053e068f6e.png

可以看到,JSON_INSERT()函数并没有更新数据表中的数据,只是修改了显示结果。


8.JSON_REMOVE(json_doc,path[,path] ...)函数


JSON_REMOVE(json_doc,path[,path] ...)函数用于移除JSON数据中指定key的数据。

 SELECT JSON_REMOVE(content, '$.address.city') FROM json_test WHERE id = 2;

f9d24f198fc441eba5ec2c6ddfda0dc2.png


9.JSON_REPLACE(json_doc,path,val[,path,val] ...)函数


JSON_REPLACE(json_doc,path,val[,path,val] ...)函数用于更新JSON数据中指定Key的数据。


SELECT JSON_REPLACE(content,'$.age',20) FROM json_test ;


27b7160211544db5875083c98cbdc8d7.png


可以看到,JSON_REPLACE()函数并没有更新数据表中的数据,只是修改了显示结果。


10.JSON_SET(json_doc,path,val[,path,val] ...)函数


JSON_SET(json_doc,path,val[,path,val] ...)函数用于向JSON数据中插入数据。


 SELECT JSON_SET(content, '$.address.street', 'xxx街道') FROM json_test WHERE id = 1;

7ecb22d2149a420a910c50fb3c9b215e.png


11.JSON_TYPE(json_val)函数


JSON_TYPE(json_val)函数用于返回JSON数据的JSON类型,MySQL中支持的JSON类型除了可以是MySQL中的数据类型外,还可以是OBJECT和ARRAY类型,其中OBJECT表示JSON对象,ARRAY表示JSON数组。

 SELECT JSON_TYPE(content) FROM json_test ;


52ddc057e5ab474580e87d57cc2c96c2.png


12. JSON_VALID(value)函数


JSON_VALID(value)函数用于判断value的值是否是有效的JSON数据,如果是,则返回1,否则返回0,如果value的值为NULL,则返回NULL。

 SELECT JSON_VALID('{"name":"binghe"}'), JSON_VALID('name'), JSON_VALID(NULL);

f2d47aa87dee4f83b5d28b0ae88261ff.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
17 1
|
12天前
|
JSON 关系型数据库 MySQL
✅MySQL用了函数到底会不会导致索引失效
MySQL 8.0 引入了函数索引,打破了传统观念,允许在索引中使用函数,提升查询性能。通过创建基于表达式的索引,如 `CONCAT`、`SUBSTRING_INDEX`、`YEAR`、`MONTH` 等,可以优化涉及这些函数的查询。虽然提高了某些查询速度,但也会增加数据维护成本。应谨慎使用,确保表达式确定且适用于常见查询模式。示例包括基于字符串、日期、数学运算和JSON属性的索引。
✅MySQL用了函数到底会不会导致索引失效
|
3天前
|
关系型数据库 MySQL
mysql使用 CONCAT(字段,字段) 函数拼接
mysql使用 CONCAT(字段,字段) 函数拼接
|
7天前
|
SQL 关系型数据库 MySQL
「Python入门」python操作MySQL和SqlServer
**摘要:** 了解如何使用Python的pymysql模块与MySQL数据库交互。首先,通过`pip install pymysql`安装模块。pymysql提供与MySQL的连接功能,例如创建数据库连接、执行SQL查询。在设置好MySQL环境后,使用`pymysql.connect()`建立连接,并通过游标执行SQL(如用户登录验证)。注意防止SQL注入,使用参数化查询。增删改操作需调用`conn.commit()`来保存更改。pymssql模块类似,但导入和连接对象创建略有不同。
11 0
「Python入门」python操作MySQL和SqlServer
|
13天前
|
SQL 存储 关系型数据库
|
17天前
|
关系型数据库 MySQL 数据库
『Django』模型入门教程-操作MySQL
一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中,模型(Model)是用来定义数据库结构的类。每个模型类通常对应数据库中的一个表,类的属性对应表中的列。通过定义模型,Django 的 ORM(Object-Relational Mapping)可以将 Python 对象映射到数据库表,并提供一套 API 来进行数据库操作。 本文介绍模型的用法。
|
17天前
|
JSON 关系型数据库 MySQL
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
14 1
|
19天前
|
JSON 关系型数据库 MySQL
MySQL常用函数解读:从基础到进阶的全方位指南
MySQL常用函数解读:从基础到进阶的全方位指南
|
17天前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之无法创建mysql的连接池什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
19天前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用