mysql操作json优点和缺点_SQL-mysql操作json

一 前言

MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型,其能在字段中使用json 类型,做到了自动校验是否为json类型数据,否则插入数据会报异常;其次,储存json数据内部做到了优化储存,能够快速读取json类型数据,比如无需将二进制json转为文本形式后读取;

公众号:知识追寻者

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 操作 JOSN

建表语句如下,为 area 字段 声明为 JSON 类型;

CREATE TABLE `order` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',

`order_name` varchar(255) DEFAULT NULL COMMENT '订单名称',

`create_time` datetime DEFAULT NULL COMMENT '创建时间',

`year` year(4) DEFAULT NULL COMMENT '年份',

`area` json DEFAULT NULL COMMENT '地区',

PRIMARY KEY (`id`),

UNIQUE KEY `order_name` (`order_name`,`create_time`)

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

MySQL 中支持 json 对象 和json 数组,他们之间可以相互嵌套;json类似map,在java中json就是map得实现类,初学者若不懂何为json,就当作map来用,即储存 key - value 形式得数据结构;注意点是 json 数据 得key 必须是字符串,可以有key无value;

2.1 插入 josn数据

插入 json 对象,east 得值 为 50 , sourth 值为65 得 json对象;

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, '{"east": "50", "south": "65"}');

等效于使用 JSON_OBJECT 函数, 示例如下

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, JSON_OBJECT("east", "50", "south", "65"));

插入 json 数组

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, '[{"east": "50", "south": "65"}]');

等效于使用 JSON_ARRAY 函数,示例如下

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, JSON_ARRAY("east", "50", "south", "65"));

2.2 查询json数据

使用 column - path 路径符 -> 查询 指定key 得值,

select order_name, area -> '$.east' from `order`

注意,如果json 数据中不存在 east 得键,则列出为null值

输出如下

--------- ------

荷小花的订单"50"

荷小花的订单

也可以使用 ->> 符号, 不同之处是使用 ->> 更加直观,输出得json数据最外层不会携带双引号,内层数据中存在双引号不会有反斜杠转义;

select order_name, area ->> '$.east' from `order`

使用 单引号 代替 双引号

select order_name, area ->> "$.east" from `order`

我们 也可以使用 JSON_EXTRACT 函数 达到同样得效果;

SELECT order_name,JSON_EXTRACT(area, '$.east') from `order`;

2.3 修改json数据

使用 JSON_SET 设置 json key 得 值

id = 1 得 area 数据如下

{"north": "55", "south": "66"}

现在将south 值改为 60 的语句示例如下

update `order` set area = json_set(area, '$[0].south', '60') where id = '1'

其中 $[0] 代表 json 中的第一个对象 ,以此类推 $[1] 为 josn 中的第二个对象;

示例

["6","2",{"east": "50", "south": "65"}]

$[0] 为"6",$[1] 为 "2" , $[2] 为 {"east": "50", "south": "65"}; $[2].east 为 "50" , 或者 $[2][1];

如果上面$[*] 表达式式理解困难也可以使用如下方式

update `order` set area = json_set(area, '$.south', '60') where id = '1'

tip: 如果更改整个json值 与 平时的更新数据方式一致

2.4 删除json中的数据

使用 json_remove 可以达到效果;

示例: 删除json 中的 south 键

update `order` set area =json_remove(area, '$.south') where id = '1'

三 jsom函数

3.1 cast

cast 函数 是特殊函数,可以使用 CAST(expr AS type) 函数进行数据类型得转换,此函数 与 convert 用法 类似 ,即 期望得表达式转为期望得类型;

比如 将 字符串 知识追寻者从默认类型转为utf8类型

SELECT CONVERT('知识追寻者' USING utf8);

如下情况下查询是字符串,非json数据

select '{"east": "50", "south": "65"}' as str

再来看看 cast 函数使用,将字符串转为json 类型

select cast( '{"east": "50", "south": "65"}' as json )

3.2 JSON_TYPE

JSON_TYPE 函数 会尝试 去解析 参数为json值,

示例

select JSON_TYPE('{"east": "50", "south": "65"}')

得到结果为json 对象

OBJECT

示例

select JSON_TYPE('[{"east": "50", "south": "65"}]')

得到结果为json数组

ARRAY

示例

select JSON_TYPE('hello')

输出为异常,无效得json

Invalid JSON text in argument 1 to function json_type: "Invalid value." at position 0.

3.3 JSON_MERGE

JSON_MERGE 函数 即 将合并多个json文档; 合并规则如下

如果都是json array,合并为json array;

如果都是json object,合并为json object;

如果有多种类型数据,则将非json array的元素封装成json array再按照如上规则进行合并;

示例

select json_merge('["west","20"]', '{"east": "50", "south": "65"}')

输出

["west", "20", {"east": "50", "south": "65"}]

3.4 JSON_VALID

JSON_VALID 函数 为 校验是否是json 函数,是返回 1 ,否则 返回0;

示例如下,返回1;

SELECT JSON_VALID('{"east": "50", "south": "65"}')

示例如下,返回 0;

SELECT JSON_VALID('hello')

3.5 JSON_INSERT

JSON_INSERT 函数 向 json 中添加新的值,不会改变已经存在的值;

id = 1 的数据如下

{"north": "55"}

更新语句如下

update `order` set area =JSON_INSERT(area, '$.north', 55 ,'$.south', "60") where id = '1'

更改结果如下

{"north": "55", "south": "60"}

3.6 JSON_REPLACE

JSON_REPLACE 替换现有的值,如果存在新的值不会添加;

id = 1 的数据如下

{"north": "55", "south": "60"}

更新语句如下

update `order` set area =JSON_REPLACE (area, '$.north', "50" ,'$.east', "60")

where id = '1'

更改结果如下

{"north": "50", "south": "60"}

3.7 JSON_SEARCH

JSON_SEARCH , 返回路径,支持返回单个和返回多个;

id = 1 的数据如下

[{"north": "50", "south": "60"}, {"north": "50", "south": "70"}]

查询 一个值为 50 的key路径

select JSON_SEARCH(area, 'one', '50') from `order` where id = '1'

输出

"$[0].north"

查询 所有值为 50 的key路径

select JSON_SEARCH(area, 'all', '50') from `order` where id = '1'

输出

["$[0].north", "$[1].north"]

3.8 JSON_KEYS

返回json顶级值底下所有key

id = 1 的数据如下

[{"north": "50", "south": "60"}, {"north": "50", "south": "70"}]

查询json数据中第一个json对象所有的key

select JSON_KEYS(area, '$[0]') from `order` where id = '1'

输出

["north", "south"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android多个水波球,android球形水波百分比控件代码

本文主要介绍的是一个球形水波的百分比控件,市面上有各种形形色色的百分比控件,我一直觉得水波是最炫的,UI给了我这个机会,然而网上搜了一大堆,不是太复杂,代码太多(反正我是调不出效果来),就是…

python数据去重的函数_python pandas dataframe 去重函数的具体使用

今天笔者想对pandas中的行进行去重操作,找了好久,才找到相关的函数 先看一个小例子 from pandas import Series, DataFrame data DataFrame({k: [1, 1, 2, 2]}) print data IsDuplicated data.duplicated() print IsDuplicated print type(IsDuplicate…

合信达 机器人_【中信建投 通信】拓邦股份:中报电话会议干货纪要

原标题:【中信建投 通信】拓邦股份:中报电话会议干货纪要一中信建投通信行业分析师 闫慧辰首先非常感谢大家参加我们举办的拓邦股份2017年中报解读电话会议。拓邦股份是我们5月份开始重点推荐的标的之一。我们观察到了公司业绩的爆发增长,同时…

android 3.0单元测试,Android Studio 3.0 gradle 3.0.0-beta2打破了Kotlin单元测试覆盖率?

我有一个简单的Kotlin课程,如下所示class MyClass {fun justSayHello(yes: Boolean): String {if (yes) {return "Hello"} else {return "Sorry"}}}我有我的测试(这里用Java编写,也可以在Kotlin中)public class MyClassTest {private MyClass myClass new…

c++ 二维数组_【技术篇】C指针与二维数组深度辨析

一、源代码/*第01行*/ CLion 2019.3.4 x64中编写的源代码截图二、深度辨析CLion 2019.3.4 x64中编译的结果截图zippo[4][2]是一个四行二列的int型二维数组①不论一维数组还是二维数组,数组名就是指向数组首个元素的指针,也即数组名就是数组首个元素的…

numberformate php_php number_format函数怎么用?

number_format函数是PHP中的一个内置函数,用于格式化一个包含数千个分组的数字,其语法是“string number_format ( $number, $decimals, $decimalpoint, $sep )”。本篇文章主要给大家介绍php number_format用法,希望对需要的朋友有所帮助&am…

android 脚本模拟点击屏幕,android 脚本模拟点击屏幕,android模拟

android 脚本模拟点击屏幕,android模拟对低概率问题,需要多次测试以复现问题,使用脚本更容易实现,避免频繁人工操作首先要了解手机的众多输入设备:命令:adb shell cat /proc/bus/input/devices/I: Bus0000 …

shiro启动之后页面访问不了_java:shiro入门——4

【7】测试【7.1】启动点击apply然后点击OK【7.2】登录过滤访问http://localhost:8080/platform/home的时候,会被【7.3】角色过滤使用“admin”用户登录,密码:123根据SecurityServiceImpl我们可以知道使用admin账号登录成功之后:此…

Android如何分析native代码,使用android-ndk-profiler对native代码进行性能分析

android-ndk-profiler需要使用gcc进行编译,从NDK r13b 起NDK使用的默认编译器从gcc换成了clang,官方提供了Simpleperf工具进行性能分析,具体情况可以参考https://developer.android.google.cn/ndk/guides/simpleperf 。下载使用编译方面的改动…

python模板语言_django的模板语言

Django模板语言1.基础语法:return render(request,qwe.html,{obj:obj}),render的最后的字典可以以键值对的形式传入多个值,在django模板中只用到两种符号变量相关:{{变量名}} 逻辑相关:{% %}1)变量相关:a: 变量名有字母数字和下划线组成,(.)用来获取对象的属性值,ls.0 --> …

oreo另一个意思_记一次有意思的统计(部分大宗商品价格指数相关性统计)

最近闲来无事,对部分大宗商品近十年的价格涨幅做了个统计,发现有些有意思的现象:大多资产价格走势如果放到一个足够长得时间维度里,那其实整体走势是比较一致的;有些资产价格走势高度相关,但是在某个时间段…

android左右耳机声音大小不一样,AirPods左右两边声音大小不同怎么办 单侧无声和两侧音量不同解决方法...

AirPods连接 iPhone 后如果出现了左右两边声音大小不一样,或者单侧无声的问题,可能是软件导致的暂时性故障,也有可能是硬件问题。当耳机音量出现异常时,可以通过以下几种方式尝试恢复。单侧无声和两侧音量不同解决方法&#xff1a…

laravel 任务队列_Laravel5.5之事件监听、任务调度、队列

流程:1.1 创建eventphp artisan make:event UserLoginLoginController.php/*** The user has been authenticated.** param IlluminateHttpRequest $request* param mixed $user* return mixed*/protected function authenticated(Request $request, $user){eve…

pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路

选自Medium作者:Victor Sanh机器之心编译参与:魔王过去一段时间,大模型层出不穷。在大家纷纷感叹「大力出奇迹」的时候,作为调用预训练语言模型最流行的库,HuggingFace 尝试用更少的参数量、更少的训练资源实现同等的性…

android 应用无法安装程序,朋友android设备无法安装我的Android应用程序,我甚至不能为我自己做...

我最近上传了我的android应用程序到市场https://market.android.com/details?idcom.DGNT,但我的朋友们不能将它安装在他们的设备上(说他们的手机不兼容)。该网站甚至说我自己的手机与我的应用程序不兼容,即使我已经通过eclipse编译了它,并成…

qsub 指定节点_PBS,QSUB常用命令

1、后台提交作业qsub语法: qsub [-a date_time] [-A account_string] [-e path] [-h] [-I] [-jjoin] [-k keep] [-l resource_list] [-m mail_options] [-nNode_allocation_Method [-L v1,[v2,[v3,[v4]]]]] [-M user_list] [-Nname] [-o path] [-p priority] [-q pool] [-r y|n…

if test 多条件_秒懂Python编程中的if __name__ == #39;main#39; 作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ main:1 这段代码的功能一个python的文件有两种使用的方法:第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ main: 的作用就是控制这两种情…

android复杂列表滑动卡顿,Android 列表滑动性能优化总结

列表滑动性能优化是一个老生常谈的问题,最近在做项目的时候又遇到了列表滑动卡顿的问题,我在经过多次思考和尝试后,终于找到了滑动卡顿的元凶,于是将经验总结下来。ViewHolder先说说最常规的ViewHolder。ViewHolder的出现是为了解…

php淘客发单_如何使用PHP的curl函数调用维易淘客接口

《如何使用PHP的curl函数调用维易淘客接口》要点:使用curl调用维易淘客接口高佣转链维易淘客接口是用GET方式调用的,直接用GET调用即可,以下用PHP为例:使用curl调用维易淘客接口高佣转链:$apihttp://api.vephp.com/hca…

python背景颜色怎么随机_Python中的随机颜色

我同意TigerhawkT3(1)你教授对pick_color()的实现是垃圾。但我不认为random.choice(),或者你教授滥用random.shuffle()的方式是最好的选择。两者的问题是,在连续调用时可以获得相同的颜色,这是在正方形内绘制正方形时不…