Mysql中的JSON系列操作函数
前言
JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。
JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本。 MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。
下面一起来实际操作一下。
创建带有 JSON 字段的表
比如一个‘文章'表,字段包括
id、标题 title、标签 tags
一篇文章会有多个标签,tags 就可以设为 JSON 类型
建表语句如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE `article` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(200) NOT NULL, `tags` json DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB; |
插入数据
插入一条带有 JSON 内容的数据,执行 insert 语句:
|
1
2
3
4
5
6
7
8
9
|
INSERT INTO `article` (`title`, `tags`)VALUES ('体验 Mysql JSON','["Mysql", "Database"]'); |
这里插入的是一个 JOSN 数组 [“Mysql”, “Database”]
查询 article 表中的所有内容,可以看到新插入的这条数据

查询
使用 JSON 函数做两个简单的查询
1.查找带有标签”Mysql”的所有文章
|
1
2
3
|
SELECT * FROM `article`WHERE JSON_CONTAINS(tags, '["Mysql"]'); |
2.查找标签中以”Data”开头的文章
|
1
2
3
|
SELECT * FROM `article`WHERE JSON_SEARCH(tags, 'one', 'Data%') IS NOT NULL; |
JSON_SEARCH 函数中3个参数的含义:
1.要查找的文档
2.查找的范围,有两个选项,'one' 查找第一个符合条件的,'all'查找所有符合条件的
3.查找的条件
JSON Path
JSON Path用来定位文档中的目标字段,例如
|
1
2
3
4
5
6
7
|
SELECT JSON_EXTRACT('{"id": 1, "name": "mysql"}','$.name'); |
结果为:mysql
JSON_EXTRACT() 是JSON提取函数,$.name 就是一个 JSON path,表示定位文档的 name 字段
JSON path 是以 $ 开头,下面看几个更多的示例
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{"num": 123,"arr": [1, 2],"obj": {"a": 3,"b": 4}}$.num //结果:123$.arr //结果:[1, 2]$.arr[1] //结果:1$.obj.a //结果:3$**.b //结果:4 |
使用 JSON path 的查询示例
|
1
2
3
4
5
|
SELECTtags->"$[0]" as 'tag'FROM `article`; |
更新数据
例如想给文章添加一个 “dev” tag,更新的条件是已经包含 “Mysql” 标签,并且还没有 “dev” 标签的数据
更新语句如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
UPDATE `article`SET tags = JSON_MERGE(tags, '["dev"]')WHEREJSON_SEARCH(tags, 'one', 'dev') IS NULLANDJSON_SEARCH(tags, 'one', 'Mysql') IS NOT NULL; |

可以看到成功添加了 “dev” 标签
再比如想把 “Mysql” 这个标签更新为 “Mysql 5.7.13″,更新语句如下:
|
1
|
UPDATE `article` set tags = JSON_SET(tags, ‘$[0]', ‘Mysql 5.7.13') ; |
上面体验了 JSON_MERGE 和 JSON_SET,用于修改JSON的函数还有很多,例如:
|
1
|
JSON_INSERT(doc, path, val[, path, val]…) |
插入数据
|
1
|
JSON_REPLACE(doc, path, val[, path, val]…) |
替换数据
|
1
|
JSON_ARRAY_APPEND(doc, path, val[, path, val]…) |
向数组尾部追加数据
|
1
|
JSON_REMOVE(doc, path[, path]…) |
从指定位置移除数据
通过初步的操作体验,感觉 Mysql 的 JSON 操作还是比较顺畅的,以后可以在mysql中使用文档结构确实很方便
新版的 Mysql 还提供了 Javascript 的控制台,类似 MongoDB 的 shell,也很方便,后面会总结出来。希望本文给大家在学习mysql的时候有所帮助,谢谢对脚本之家的支持。
Mysql中的JSON系列操作函数的更多相关文章
- JavaScript中常见的数组操作函数及用法
JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...
- JavaScript中常见的字符串操作函数及用法
JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...
- 在MySQL中实现Rank高级排名函数【转】
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- 关于mysql中存储json数据的读取问题
在mysql中存储json数据,字段类型用text,java实体中用String接受. 返回前端时(我这里返回前端的是一个map),为了保证读取出的数据排序错乱问题,定义Map时要用LinkedHas ...
- 在MySQL中实现Rank高级排名函数
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- LoadRunner中常用的字符串操作函数
LoadRunner中常用的字符串操作函数有: strcpy(destination_string, source_string); strc ...
- trim()函数 mysql中的强大字符串过滤函数
mysql中功能强大的trim()函数. 去除两边空格: mysql> select trim(' hello world '); +-----------------------+ | tri ...
- 开发过程中 的一些 补充知识点 + 关于mysql中的日期和时间函数?
参考: https://www.jb51.net/article/23966.htm https://yq.aliyun.com/articles/260389 mysql中的 日期格式是: HHHH ...
随机推荐
- c++编辑器下载地址
https://msdn.itellyou.cn/ 输入上述地址选中下图所示的按钮:
- CSS中的text-shadow。
text-shadow(文字投影),box-shadow(容器投影),border-radius(圆角)这三个属性估计以后用的比较多,记录 一下.目前不支持IE系列(不过可以使用其他方法实现,下文有详 ...
- 前端跨域之jsonp跨域
jsonp跨域原理 原理:因为通过script标签引入的js是不受同源策略的限制的(比如baidu.com的页面加载了google.com的js).所以我们可以通过script标签引入一个js或者一个 ...
- Linux下设置防火墙(开启端口)
1.修改文件/etc/sysconfig/iptables 在文件中加入如下内容,目的是对外界开放7001端口 -A RH-Firewall-1-INPUT -m state --state NEW ...
- java封装的使用
一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...
- codevs1063 合并果子 优先队列(小根堆)
题目传送门 这道题很容易想到优先把两堆重量最小的合并比较优 然后乱搞一下就可以啦 #include<cstdio> #include<cstring> #include< ...
- [POJ1286&POJ2154&POJ2409]Polya定理
Polya定理 L=1/|G|*(m^c(p1)+m^c(p2)+...+m^c(pk)) G为置换群大小 m为颜色数量 c(pi)表示第i个置换的循环节数 如置换(123)(45)(6)其循环节数为 ...
- loadView不需要调用super view,原因:loadView方法的作用就是自定义view.[super loadView]会耗性能.
https://www.evernote.com/shard/s227/sh/423fd81d-ab1c-4e6c-997d-39359472a4a5/f220ade8bd9be149ad70 ...
- bzoj 2819 博弈论
我们可以把 n为偶数的时候,n*n的棋盘看成若干个不相交的2*1的格子,那么对于每个2*1的格子,如果先手选了其中的一个,另一个人都可以选另一个,所以最后使先手没有可以选的格子,先手必败(这里的先手并 ...
- bzoj 2142 国家集训队试题 礼物
问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数, 也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并 那么问题就转化成了快速求C(N ...