对MySQL中JSON数据类型的操作和分析
2017-08-15 21:34
501 查看
JSON作为以键值对为主的存储形式,符合很多业务场景,尤其对于python中dict字典数据类型,能直接相互转换,更加适应了python的某些使用情况。
此外,JSON作为不限定固定结构的键值对,能方便灵活的使用在数据变动性比较大的场景,如对于网络数据的爬取收集等,当然其中也存在一些问题,下文再分析。
这里本文先列举MySQL中对一些JSON数据类型的常用语句和函数(参考MySQL官方文档,建议大家有疑惑的直接去查阅官方文档)。
说明:json除了键值对的形式以外,还包括Array数列形式,这在mysql5.7及以上也是支持的,对Array中元素的操作相当于直接对键值对中的值操作,少了“键”的定位这一步,这里不单独展示,所有的函数都都同时支持,大同小异
也可以用info->”$.数学”代替json_extract()函数
用json_keys()函数选择所有的键值
json中的path路径
.a.b:表示键a下的键b.a[1]:表示键a对应的值(如果是列表的话)的第二个元素
json_search()函数:直接对“值”(且值必须是字符串,数列或者键值对都不行)或数列中的元素操作
直接利用键值进行选择
json_array_insert()函数:在指定位置插入元素
json_set():直接设定某值
json_merge(column,key-value)函数:向json类型字段中添加元素
json_replace()函数
所有的函数在选择时候的依据都是“值”,不能依靠“键”,如json_search,json_contain,这样对于键的选择就必须要指明,这在一些结构不固定,“键”不明确的情况不太方便。
没有发现对“键”的模糊查找
很多情况下,对值的修改都限定为字符串,不能改为数列或者键值对形式。如下将数学的值直接改为数列是不能执行的:
也就说,对数列和字典的支持还不够。
以上提出的这些缺陷或许是因为我对mysql了解不够深入,或许mysql有相应的解决办法,这里暂时存疑,希望知道的朋友能告知,以上。
此外,JSON作为不限定固定结构的键值对,能方便灵活的使用在数据变动性比较大的场景,如对于网络数据的爬取收集等,当然其中也存在一些问题,下文再分析。
这里本文先列举MySQL中对一些JSON数据类型的常用语句和函数(参考MySQL官方文档,建议大家有疑惑的直接去查阅官方文档)。
说明:json除了键值对的形式以外,还包括Array数列形式,这在mysql5.7及以上也是支持的,对Array中元素的操作相当于直接对键值对中的值操作,少了“键”的定位这一步,这里不单独展示,所有的函数都都同时支持,大同小异
1. insert(插入)操作
先用insert给出操作面向的数据对象insert into jwc(st_num,info) value('131141','{"数学":[95,4],"英语":{"英语上":[87,3],"英语下":[82,3]},"体育":"不及格"}')
2. select(投影)操作
对于JSON数据的选择有一个重要的函数——json_extract()//选择“数学”对应的值 select json_extract(info,"$.数学") from jwc where id='131141'
也可以用info->”$.数学”代替json_extract()函数
//选择“数学”对应的值 select info->"$.数学" from jwc where id='131141'
用json_keys()函数选择所有的键值
select json_keys(info) from jwc
json中的path路径
.a.b:表示键a下的键b.a[1]:表示键a对应的值(如果是列表的话)的第二个元素
3. where选择操作
json_contains(column,elem,key)函数判断包含带有elem元素的key的column属性是否存在//注意中间elem(95)一定要用字符串形式表示 select * from jwc where json_contains(info,'95','$.数学')
json_search()函数:直接对“值”(且值必须是字符串,数列或者键值对都不行)或数列中的元素操作
//json_search的第二个参数one表示找一个,all表示找到所有 select * from jwc where json_search(info,'one',"%及格") is not null;
直接利用键值进行选择
select * from jwc where info->'$.数学[0]'>90;
4. update更新操作
json_array_append()函数:直接在定位元素的后面添加//对于非列表的值直接扩展成列表 update personal_info set info=json_array_append(info,'$."数学"',4) where id=6;
json_array_insert()函数:在指定位置插入元素
update personal_info set info=json_array_insert(info,'$."数学"[0]',4) where id=6;
json_set():直接设定某值
update personal_info set info=json_set(info,'$."数学"',4) where id=6;
json_merge(column,key-value)函数:向json类型字段中添加元素
update personal_info set info=json_merge(info,'{"提示":"this is a test"}') where id=6;
json_replace()函数
update personal_info set info=json_replace(info,'$."提示"','this is another test') where id=6;
缺陷与思考
上述 是关于mysql对json数据类型的操作介绍,下面分析一下json数据类型使用的一些问题。所有的函数在选择时候的依据都是“值”,不能依靠“键”,如json_search,json_contain,这样对于键的选择就必须要指明,这在一些结构不固定,“键”不明确的情况不太方便。
没有发现对“键”的模糊查找
很多情况下,对值的修改都限定为字符串,不能改为数列或者键值对形式。如下将数学的值直接改为数列是不能执行的:
update personal_info set info=json_replace(info,'$."提示"','this is another test','$."数学"',[94,3]) where id=6;
也就说,对数列和字典的支持还不够。
以上提出的这些缺陷或许是因为我对mysql了解不够深入,或许mysql有相应的解决办法,这里暂时存疑,希望知道的朋友能告知,以上。
相关文章推荐
- MySQL JSON数据类型操作
- MySQL操作之JSON数据类型操作详解
- .NET操作Excel/CSV文件以及分析JSON/XML数据类型
- mysql 查询json类型数据
- MySQL——数据类型与操作数据表
- 说说 MySQL JSON 数据类型
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- DataContractJsonSerializer 类 操作json类型数据
- mysql零距离接触-数据类型和操作数据表
- 黄聪:C#如何操作JSON数据(读取、分析)
- Java中的json数据类型操作
- 分析MySQL数据类型的长度
- mysql 查询json类型数据
- MySql数据类型分析(银行家舍入法) Part3
- mysql中整数数据类型分析
- MySQL之数据类型与操作数据表
- mysql数据类型分析
- mybatis如何操作text类型(mysql)数据呢?
- MySQL学习笔记(二)数据类型及数据表的相关操作
- MySql数据类型分析(银行家舍入法) Part3