MySQL之Json类型

1 Json 类型简介

MySQL 5.7 之后提供了Json类型,是MySQL 结合结构化存储和非结构化存储设计出来的一个类型。

在某些场景下,Json 类型简直是福音。

场景1: 用户画像,描述用户的标签等类似场景,比如互联网医院类系统的患者健康档案,有很多信息不是必填项,如:身高、体重、三围等等信息,可以使用 Json 存储。

场景2: 游戏类场景;

场景3: 存储图片等附属信息,比如图片的分辨率,图片标题等。

2 让我们看看Json怎么用的

创建表,并插入数据

CREATE TABLE UserLogin (    userId BIGINT NOT NULL,    loginInfo JSON,    PRIMARY KEY(userId));INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (1, '{\'QQ\': \'82946772\', \'wxchat\': \'破产码农\', \'cellphone\': \'13918888888\'}');INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (2, '{\'cellphone\': \'15026888888\'}');INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (3, '{\'QQ\': \'82946772\', \'wxchat\': \'破产码农\', \'cellphone\': \'13918888889\'}');

2.1 JSON_EXTRACT 函数,获取Json字段中特定属性的值

SELECT JSON_UNQUOTE(JSON_EXTRACT(loginInfo, '$.cellphone')) from UserLogin;

获取cellphone属性的值。可以使用->写法或者->>写法。

-- 带引号SELECT loginInfo->'$.cellphone' from UserLogin;-- 不带引号SELECT loginInfo->>'$.cellphone' from UserLogin;

函数说明:

JSON_EXTRACT(或->)从JSON文档返回数据。

JSON_UNQUOTE取消引用JSON值,并以utf8mb4字符串的形式返回结果。

2.2 JSON_CONTAINS 查询Json中满足cellphone等于13918888888的记录

SELECT * from UserLogin where JSON_CONTAINS(loginInfo, ''13918888888'', '$.cellphone')

说明:使用 JSON_CONTAINS 搜索指定键的值是否与指定值匹配。

2.3 给Json中的字段添加索引

-- 增加虚拟列-cellphone,值通过loginInfo计算而来alter table UserLogin add COLUMN cellphone varchar(50) as (loginInfo->>'$.cellphone');-- 给cellphone 这一列增加唯一索引alter table UserLogin add unique index idex_cellphone(cellphone);

可以看到的确使用了该索引进行查询

2.4 JSON_CONTAINS_PATH 判断Json中是否有对应字段

所有记录中有多少记录包含wxchat字段

SELECT count(*), JSON_CONTAINS_PATH(loginInfo, 'one', '$.wxchat') cp FROM UserLogin GROUP BY cp

返回

说明,包含wxchat字段有两条记录,不包含的有一条记录。

2.5 JSON_PRETTY 让Json长的更好看

SELECT JSON_PRETTY(loginInfo) from UserLogin 

可以返回格式化的json数据

{  'QQ': '82946772',  'wxchat': '破产码农',  'cellphone': '13918888888'}

2.6 JSON_STORAGE_SIZE返回二进制表示的字节数

返回loginInfo字段中存储的二进制表示的字节数。

SELECT max(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;SELECT avg(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;SELECT min(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;

2.7 其他函数

  • JSON_OBJECT 计算键值对列表并返回包含这些键值对的JSON对象,使用JSON_OBJECT。
  • JSON_OBJECTAGG 接受两个列名或表达式,并返回一个包含JSON_OBJECTAGG键值对的JSON对象。
  • JSON_ARRAY 计算一个值列表,并使用JSON_ARRAY返回包含这些值得JSON数组。
  • JSON_ARRAYAGG 将结果集聚合为单个JSON数组,其元素由带有JSON_ARRAYAGG的行组成。
  • JSON_TABLE 从JSON文档中提取数据,并将其作为具有JSON_TABLE指定列的关系表返回。

总结

JSON 类型是 MySQL 5.7 版本新增的数据类型,用好 JSON 数据类型可以有效解决很多业务中实际问题。最后,我总结下今天的重点内容: 使用 JSON 数据类型,推荐用 MySQL 8.0.17 以上的版本,性能更好,同时也支持 Multi-Valued Indexes;

  • JSON 数据类型的好处是无须预先定义列,数据本身就具有很好的描述性;
  • 不要将有明显关系型的数据用 JSON 存储,如用户余额、用户姓名、用户身份证等,这些都是每个用户必须包含的数据;
  • JSON 数据类型推荐使用在不经常更新的静态数据存储。

参考:

1、30 mins with MySQL JSON functions:https://dasini.net/blog/2018/07/23/30-mins-with-mysql-json-functions/

2、拉钩教育《姜承尧的MySQL实战宝典》-04 | 非结构存储:用好 JSON 这张牌:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=869#/detail/pc?id=7320

(0)

相关推荐

  • WEB前端第五十六课——MySQL、前后台交互

    WEB前端第五十六课——MySQL、前后台交互

  • mysql数据库中利用GROUP

    mysql数据库中利用GROUP_CONCAT)把查询的结果列合并分组显示 效果图 在数据库中group by 一列查询出若干行数据,sql如下: select * from table group ...

  • iCloud sent warning i used 50% space of 5GB

    10/16/2021 got warning email from iCloud that i used 50% space of 5GB and 'For $0.99 a month, you ca ...

  • SAP MM MARD 表里的Storage Bin 字段

    SAP MM MARD 表里的Storage Bin 字段 笔者在所在的项目上的一个偶然机会,看到了MARD表里有个storage bin字段: 很是奇怪.MARD表里是保存物料的IM层面的各个sto ...

  • MySQL中JSON使用

    文章目录 前言 1.创建表和插入数据: 2.查询json中的使用字段: 3.json科普: 4.mysql中操作json的函数: 4.1 JSON_ARRAY:生成json数组. 4.2 JSON_O ...

  • mysql中json字段查询时间范围的方法

    在开发过程中经常会定义一些扩展字段,且需要增加查询,在以往的mysql版本中,json结构是不支持查询的,这样就导致我们不得不新定义字段.在mysql 5.7之后,为了解决这一问题,增加了相关的查询. ...

  • mysql数据库字段类型的选择原则

    原文链接:http://blog.csdn.net/u013412790/article/details/51615407 数据库类型的选择对数据库的性能影响很大  1 . 数据类型会影响存储空间的开 ...

  • MySQL 8.0中的JSON增强

    现在很多应用环境中都能看到JSON灵活的影子.各阶段数据层次的递归层次,能很好的分辨.一直对MySQL的JSON很期待的,最近才有时间研究一下. JSON了解 JSON就是一串字符串,只不过元素会使用 ...

  • Mysql数据库的索引类型有哪些?

    Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. MySQL索引类型: 1.普通索引 最基 ...

  • 五分钟爆改,把你的JSON/CSV文件打造成MySQL数据库

    生活中,你我一定都看到过这种「xx元爆改出租屋」,「爆改小汽车」之类的文章,做为IT人,折腾的劲头一点也不差. 软件开发过程中,你是否有时候,会拿着业务提供的一个个CSV或者JSON的数据文件,写个解 ...

  • MySQL复杂查询:连接查询+取某个类型的最大值

    本文链接:https://www.cnblogs.com/alanabc/p/10167926.html 需求 假设有一个考试,比如CET(包括CET-4和CET-6),学生可以多次报考刷分.现在某教 ...

  • mysql最大字段数量及 varchar类型总结

    mysql最大字段数 一直对mysql最大字段数不明确有人说是1024 还有人说 Max columns per row 4096 InnoDB is limited to 1000 columns ...

  • MySQL 时间类型 datetime、bigint、timestamp选哪个?很多人答错了

    数据库中可以用datetime.bigint.timestamp来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入50w数据 数据表: CREATE TABLE ` ...