mysql的json使用

目录

 

一、前言

二、常见使用:

1、创建一个新表

2、数据的插入:

3、路径语法:

4、数据的查询:

5、其他常用方法:


一、前言

mysql在5.7版本之后就开始支持json数据类型了,json数据类型在存储的时候会做格式校验,不满足json格式的会报错。相比于Json格式的字符串类型,Json数据类型的优势有:

(1)存储在JSON列中的JSON内容的会被自动验证。不符合Json书写规范的会产生错误;
(2)最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式;
(3)最主要的就是不用每次新增属性的时候都要修改表的结构增加对应的列,影响所有的数据。

二、常见使用:

1、创建一个新表

#表名t_json;id为主键列且自增;json_info列类型为json
create table t_json(
	id int auto_increment,
	json_info json,
	primary key(id)
);

2、数据的插入:

JSON字段插入数据的时候有两种方式:一种是直接插入满足json格式的原生字符串;另外一种是使用JSON_OBJECT、JSON_ARRAY函数先构建好json数据然后再插入数据。举个例子,前者就是'{"id": 1, "name": "张三", "age": 18}后者就是JSON_OBJECT('id', 2, 'name', '李四', 'age', 18}。

注:JSON_OBJECT、JSON_ARRAY这些方法名,大小写均可。

(1)直接插入原生json格式字符串:

#直接插入json格式字符串
insert into t_json (json_info) values('{"name":"tom","age":"20"}');
#直接插入json格式字符串(包含array数组)
insert into t_json (json_info) values('{"name":"shuozhuo","age":"25", "familymember":[{"name":"zhizhuo","age":26},{"name":"louzhuo","age":55}]}');

注:个人推荐用这个原生json格式的数据比较好,同json的学习相互促进。

(2)使用JSON_OBJECT、JSON_ARRAY函数先构建好json数据然后再插入数据

#使用JSON_OBJECT构建json数据(这里把age当成string)
insert into t_json (json_info) values(JSON_OBJECT('name','Jane','age','23'));
#使用JSON_OBJECT构建json数据、使用JSON_ARRAY构建数组(这里把age当成string)
insert into t_json (json_info) values(JSON_OBJECT('name','zhizhuo','age','26','familymember',JSON_ARRAY(JSON_OBJECT('name','shuozhuo','age',25),JSON_OBJECT('name','louzhuo','age',55))));

(3)把上面的age字段的数字str更改成数值类型

update t_json set json_info = '{"name":"Tom","age":20}' where json_info->'$.name'='tom' limit 1;
update t_json set json_info = '{"name":"shuozhuo","age":25, "familymember":[{"name":"zhizhuo","age":26},{"name":"louzhuo","age":55}]}' where json_info->'$.name' ='shuozhuo' limit 1;
update t_json set json_info = JSON_OBJECT('name','Jane','age',23) where json_info->'$.name'='Jane' limit 1;
update t_json set json_info = JSON_OBJECT('name','zhizhuo','age',26,'familymember',JSON_ARRAY(JSON_OBJECT('name','shuozhuo','age',25),JSON_OBJECT('name','louzhuo','age',55))) where json_info->'$.name'='zhizhuo' limit 1;

注:update的时候一定要加上limit 1;否则在where被忽略的情况下不堪设想。

(4)再插几条数据

insert into t_json(json_info) values ('{"name": "张三", "age": 18, "sister": [{"name": "张大姐", "age": 30}, {"name": "张二姐", "age": 20}]}');
insert into t_json(json_info) values (JSON_OBJECT('name', '李四', 'age', 18, 'sister', JSON_ARRAY(JSON_OBJECT('name', '李大姐', 'age', 28), JSON_OBJECT('name', '李二姐', 'age', 25))));
insert into t_json(json_info) values ('{"name": "小明", "age": 18, "sister": [{"name": "小明大姐", "age": 25, "friend": [{"name": "大姐朋友一", "age": 25}, {"name": "大姐朋友二", "age": 25}]}, {"name": "小明二姐", "age": 20, "friend": [{"name": "二姐朋友一", "age": 22}, {"name": "二姐朋友二", "age": 21}]}]}');

3、路径语法:

在了解搜索和修改JSON值之前,先来看看JSON的路径语法。
(1).keyName:JSON对象中键名为keyName的值;
对于不合法的键名(如有空格),在路径引用中必须用双引号"将键名括起来,例,."key name";
(2)[index]:JSON数组中索引为index的值,JSON数组的索引同样从0开始;
[index1 to index2]:JSON数组中从index1到index2的值的集合;
(3).*: JSON对象中的所有value;
(4)[*]: JSON数组中的所有值;
(5)prefix**suffix: 以prefix开头并以suffix结尾的路径;
(6)**.keyName为多个路径,如对于JSON对象'{"a": {"b": 1}, "c": {"b": 2}}','$**.b'指路径$.a.b和$.c.b;
(7)不存在的路径返回结果为NULL;
(8)前导$字符表示当前正在使用的JSON文档
例子:对于数组[3, {"a": [5, 6], "b": 10}, [99, 100]]
$[1]为{"a": [5, 6], "b": 10}。
[1].a为[5, 6]。
$[1].a[1]为 6。
$[1].b为 10。
$[2][0]为 99。

4、数据的查询:

#1.查看表中的所有数据
select * from t_json;

#2.引用json字串中的一级属性——列名->'$.属性名'
select * from t_json where json_info->'$.name'='李四';
select * from t_json where json_info->'$.age'='25';
select json_info->'$.age' as age,
	   json_info->'$.name' as name
from t_json where json_info->'$.name'='shuozhuo';

#3.引用json字串的json数组中的属性——列名->'$.数组名[index].数组内属性'
select json_info->'$.age' as age,
	   json_info->'$.name' as name,
	   json_info->'$.familymember[0].name' as membername
from t_json where json_info->'$.name'='shuozhuo';
select json_info->'$.age' as age,
	   json_info->'$.name' as name,
	   json_info->'$.familymember[0].name' as membername
from t_json where json_info->'$.name'='shuozhuo';
select json_info->'$.age' as age,
	   json_info->'$.name' as name,
	   json_info->'$.familymember[*].name' as membername
from t_json where json_info->'$.name'='shuozhuo';
注:index中填'*'表示所有。

#4.查看数据类型——使用JSON_TYPE
select JSON_TYPE(json_info)  as info_type,
	   JSON_TYPE(json_info->'$.age')  as age_type,
	   JSON_TYPE(json_info->'$.name')  as name_type,
	   JSON_TYPE(json_info->'$.familymember')  as fmember_type
from t_json 
where json_info->'$.name' = 'shuozhuo';


#5.从column中提取json值—— JSON_EXTRACT
(1)JSON对象
select JSON_EXTRACT('{"name":"cuocuo","age":24}','$.name'); #一个最简单直观的例子
+-----------------------------------------------------+
| JSON_EXTRACT('{"name":"cuocuo","age":24}','$.name') |
+-----------------------------------------------------+
| "cuocuo"                                            |
+-----------------------------------------------------+
select JSON_EXTRACT(json_info,'$.name') as name,JSON_EXTRACT(json_info, '$.age') as age from t_json;
+------------+------+
| name       | age  |
+------------+------+
| "Tom"      | 20   |
| "shuozhuo" | 25   |
| "Jane"     | 23   |
| "zhizhuo"  | 26   |
| "张三"     | 18   |
| "李四"     | 18   |
| "小明"     | 18   |
+------------+------+
(2)JSON数组
select JSON_EXTRACT('["aaaa","bbbb","cccc","dddd"]','$[1]');   #一个最简单直观的例子
+------------------------------------------------------+
| JSON_EXTRACT('["aaaa","bbbb","cccc","dddd"]','$[1]') |
+------------------------------------------------------+
| "bbbb"                                               |
+------------------------------------------------------+

5、mysql json其他常用方法:

(1)JSON_REPLACE——替换值(只替换已经存在的旧值)

select json_replace('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.age',25);
+----------------------------------------------------------------------------+
| json_replace('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.age',25) |
+----------------------------------------------------------------------------+
| {"age": 25, "name": "tancuocuo"}                                           |
+----------------------------------------------------------------------------+

(2)JSON_SET——设置值(对旧值替换,对不存在的则插入)

select json_set('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.high',160);
+--------------------------------------------------------------------------+
| json_set('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.high',160) |
+--------------------------------------------------------------------------+
| {"age": 20, "high": 160, "name": "tancuocuo"}                            |
+--------------------------------------------------------------------------+

(3)JSON_INSERT——插入值(插入新值,但不替换已经存在的旧值)

select json_insert('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.high',160);
+-----------------------------------------------------------------------------+
| json_insert('{"name":"cuocuo","age":20}','$.name',"tancuocuo",'$.high',160) |
+-----------------------------------------------------------------------------+
| {"age": 20, "high": 160, "name": "cuocuo"}                                  |
+-----------------------------------------------------------------------------+

(4)JSON_REMOVE——删除JSON中的某项

select json_remove('["aaaa","bbbb","cccc","eeee"]','$[2]');
+-----------------------------------------------------+
| json_remove('["aaaa","bbbb","cccc","eeee"]','$[2]') |
+-----------------------------------------------------+
| ["aaaa", "bbbb", "eeee"]                            |
+-----------------------------------------------------+

参考:https://www.jianshu.com/p/25161add5e4b 

https://blog.csdn.net/u011207553/article/details/88912219

https://blog.csdn.net/asd529735325/article/details/107205214

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱齿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值