mysql自5.7.8版本开始,就支持了json结构的数据存储和查询
mysql8新特性: https://blog.csdn.net/xianjuke008/article/details/86507622?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159592295519725250116614%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159592295519725250116614&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-86507622.first_rank_ecpm_v3_pc_rank_v4&utm_term=mysql8%E6%96%B0%E7%89%B9%E6%80%A7&spm=1018.2118.3001.4187
create table testjson(
`id` int(20) NOT NULL COMMENT '编号',
`content` json COMMENT '内容',
PRIMARY KEY (`id`) USING BTREE
)
函数名称 | 描述 |
---|---|
JSON_OBJECT | 创建一个json对象 |
JSON_ARRAY | 创建一个数组 |
JSON_INSERT | 对json对象增加属性 |
JSON_ARRAY_INSERT | 对json数组增加元素 |
JSON_ARRAY_APPEND | 对json数组或者对象的值变为array |
JSON_SET | 如果不存在,增加,如果存在,替换现有值 |
JSON_REPLACE | 替换现有值 |
JSON_REMOVE | 删除指定json的属性 |
JSON_EXTRACT | 返回json的指定值 |
-> | 等价于JSON_EXTRACT |
JSON_LENGTH | 返回json文档里面元素个数 |
JSON_CONTAINS_PATH | 判断路径是否存在,0表示不存在,1表示存在 |
JSON_CONTAINS | 判断文档内容是否存在,0表示不存在,1表示存在 |
JSON_UNQUOTE | 去除json字符串的引号,将值转成string类型 |
->> | 等价于JSON_UNQUOTE json_unquote(column -> path)的简洁写法 |
JSON_SEARCH | 按给定字符串关键字搜索json,返回匹配的路径 |
创建一个json数组
set @a=JSON_ARRAY(1,2,'x',3,'y','scx');
插入数组
set @a = JSON_ARRAY_INSERT(@a,'$[1]','a')
-- select @a 结果[1,'a',2,'x',3,'y','scx']
如果是数组添加到后面,如果不是数组,先转成数组再添加到后面
set @a = JSON_ARRAY_APEND(@a,'$[0]','z')
-- select @a 结果[[1,'z'],'a',2,'x',3,'y','scx']
set @c=JSON_OBJECT('id',1,'content','tx');
set @c = JSON_ARRAY_APEND(@c,'$.content','z')
-- select @c 结果{"id":1,"content":["tx","z"]}
创建一个json对象(奇数位置是key,偶数位置是value)
set @b=JSON_OBJECT('id',1,'name','tx','age',18);
插入新的属性,不对旧属性做修改
set @b = JSON_INSERT(@b,'$.content','abc')
-- select @b 结果 {"id":1, "name":"tx", "age":18 ,"content":"abc"}
-- set @b = JSON_INSERT(@b,'$.id',2)无效
替换原有值,增加新值
set @d = JSON_OBJECT('id',1,'name','tx')
select JSON_SET(@d,'$.name','xx','$.age',22)
-- 结果 {"id":1, "name":"xx", "age":22}
仅替换原有值
select JSON_REPLACE(@d,'$.name','tangxiang')
-- 结果 {"id":1, "name":"tangxiang", "age":22}
移除属性
select JSON_REMOVE(@d,'$.age')
-- 结果 {"id":1, "name":"tangxiang"}
查询json的属性值
select JSON_EXTRACT(@d,'$.name');
-- 结果"tx"
select content->'$.name' from json_demo where id=1;
-- 注意 -> 这种写法必须是列的情况
查询json文档里面元素个数
select JSON_LENGTH(@d)
-- 结果2(id,name)
查询json路径,如果有返回1,如果没有返回0
select JSON_CONTAINS_PATH(content,'one','$.name','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'one','$.nasdasme','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'all','$.name','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'all','$.nasdasme','$.id') from json_demo where id=1;
查询包含值,存在返回1,没有返回0(精确匹配)
select JSON_CONTAINS(content,'1') from json_demo where id=1;
select JSON_CONTAINS(content,'{"attr":"red"}') from json_demo where id=1;
查询的json指定值,并去掉引号
-- 去掉引号
SELECT JSON_UNQUOTE(content->"$.name") from json_demo where id=1;
SELECT content->>'$.name' from json_demo where id=1;
SELECT content->'$.name' from json_demo where id=1;
-- 结果 tx tx "tx"
按给定字符串关键字搜索json,返回匹配的路径
-- 查询json路径
update json_demo set content=JSON_INSERT(content, '$.color','red') where id=1;
SELECT JSON_SEARCH(content, 'one', 'red') from json_demo;
SELECT JSON_SEARCH(content, 'all', 'red') from json_demo;
-- 结果 "$.attr" ["$.attr", "$.color"]
TRUNCATE table json_demo;
-- 创建json对象
insert into json_demo(content) values(JSON_OBJECT('id',1,'name','tangxiang'));
select * from json_demo;
-- 创建json数组
insert into json_demo(content) values(JSON_ARRAY(1,2,3,4));
select * from json_demo;
-- json数组新增元素,下标位置是1的地方插入x,其他元素往后移
update json_demo set content=JSON_ARRAY_INSERT(content, '$[1]', 'x') where id=2;
select * from json_demo;
-- 在下标为2的位置上,将元素变为数组,将x添加到后面
update json_demo set content=JSON_ARRAY_APPEND(content, '$[2]', 'x') where id=2;
select * from json_demo;
-- 将name属性由字符串变为数组,将x添加到后面
update json_demo set content=JSON_ARRAY_APPEND(content, '$.name', 'x') where id=1;
select * from json_demo;
-- 修改name值,增加attrjson属性
update json_demo set content=JSON_SET(content, '$.name', 'tx','$.attr','red') where id=1;
select * from json_demo;
-- 新增属性值,尝试更改name,JSON_INSERT不会修改旧的数据
update json_demo set content=JSON_INSERT(content, '$.descri', 'this is desc', '$.needdel', 'del', 'name','zhangsan') where id=1;
select * from json_demo;
-- JSON_REPLACE修改属性值
update json_demo set content=JSON_REPLACE(content, '$.needdel', 'no_del') where id=1;
select * from json_demo;
-- 移除needdel属性
update json_demo set content=JSON_REMOVE(content, '$.needdel') where id=1;
select * from json_demo;
-- 查询json的name属性
select JSON_EXTRACT(content,'$.name' ) from json_demo where id=1;
-- 或者这种写法,简洁形式
select content->'$.name' from json_demo where id=1;
-- 查询数组的下标1号位
select JSON_EXTRACT(content,'$[1]' ) from json_demo where id=2;
-- jsonobject返回属性个数,数组返回数组个数
select JSON_LENGTH(content) from json_demo;
-- 判断路径是否存在
select JSON_CONTAINS_PATH(content,'one','$.name','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'one','$.nasdasme','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'all','$.name','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'all','$.nasdasme','$.id') from json_demo where id=1;
select JSON_CONTAINS_PATH(content,'one','$[0]') from json_demo where id=2;
-- 判断文档内容是否存在
select JSON_CONTAINS(content,'1') from json_demo where id=1;
select JSON_CONTAINS(content,'{"attr":"red"}') from json_demo where id=1;
-- 去掉引号
SELECT JSON_UNQUOTE(content->"$.name") from json_demo where id=1;
SELECT content->>'$.name' from json_demo where id=1;
SELECT content->'$.name' from json_demo where id=1;
-- 查询json路径
update json_demo set content=JSON_INSERT(content, '$.color','red') where id=1;
SELECT JSON_SEARCH(content, 'one', 'red') from json_demo;
SELECT JSON_SEARCH(content, 'all', 'red') from json_demo;
mysql json文档下载:
https://download.csdn.net/download/Ellen_Tangxiang/12670018