mysql中json的支持(MySQL中json字段的操作方法)
mysql中json的支持
MySQL中json字段的操作方法MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:
还是从例子看起:
|
mysql> create table test1(id int ,info json); Query OK, 0 rows affected (0.02 sec) mysql> insert into test1 values (1, '{"name":"yeyz","age":26}' ),(2, '{"name":"zhangsan","age":30}' ),(3, '{"name":"lisi","age":35}' ); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from test1; + ------+---------------------------------+ | id | info | + ------+---------------------------------+ | 1 | { "age" : 26, "name" : "yeyz" } | | 2 | { "age" : 30, "name" : "zhangsan" } | | 3 | { "age" : 35, "name" : "lisi" } | + ------+---------------------------------+ 3 rows in set (0.00 sec) |
首先我们创建了一个表test1,其中id是int字段,info是json字段,插入了三条数据,如上:
|
mysql> select * from test1 where json_extract(info, "$.age" )>=30; + ------+---------------------------------+ | id | info | + ------+---------------------------------+ | 2 | { "age" : 30, "name" : "zhangsan" } | | 3 | { "age" : 35, "name" : "lisi" } | + ------+---------------------------------+ 2 rows in set (0.00 sec) |
我们可以通过json_extract的方法得到json中的内容。其中:
1、$符号代表的是json的根目录,
2、我们使用$.age相当于取出来了json中的age字段,
3、当然,在函数最前面,应该写上字段名字info
下面来看json中常用的函数:
a、json_valid判断是否是json字段,如果是,返回1,如果不是,返回0
|
mysql> select json_valid(2); + ---------------+ | json_valid(2) | + ---------------+ | 0 | + ---------------+ 1 row in set (0.01 sec) mysql> select json_valid( '{"num":2}' ); + -------------------------+ | json_valid( '{"num":2}' ) | + -------------------------+ | 1 | + -------------------------+ 1 row in set (0.00 sec) mysql> select json_valid( '2' ); + -----------------+ | json_valid( '2' ) | + -----------------+ | 1 | + -----------------+ 1 row in set (0.00 sec) mysql> select json_valid( 'name' ); + --------------------+ | json_valid( 'name' ) | + --------------------+ | 0 | + --------------------+ 1 row in set (0.00 sec) |
这里需要注意的是,如果传入了字符串2,那么,返回结果是1
b、json_keys传回执行json字段最上一层的key值
|
mysql> select json_keys( '{"name":"yeyz","score":100}' ); + ------------------------------------------+ | json_keys( '{"name":"yeyz","score":100}' ) | + ------------------------------------------+ | [ "name" , "score" ] | + ------------------------------------------+ 1 row in set (0.01 sec) mysql> select json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' ); + ----------------------------------------------------------------+ | json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' ) | + ----------------------------------------------------------------+ | [ "name" , "score" ] | + ----------------------------------------------------------------+ 1 row in set (0.00 sec) #如果有多层,可以在最后面使用$的方法,拿到其中的某一层的目录 mysql> select json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' , '$.score' ); + --------------------------------------------------------------------------+ | json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' , '$.score' ) | + --------------------------------------------------------------------------+ | [ "math" , "English" ] | + --------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
c、json_length函数,返回最上一层的key个数,如果想取到中间的某一层,则可以使用$的方法,如下:
|
mysql> select json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ); + ---------------------------------------------------------------------------+ | json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ) | + ---------------------------------------------------------------------------+ | 3 | + ---------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' , '$.score' ); + -------------------------------------------------------------------------------------+ | json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' , '$.score' ) | + -------------------------------------------------------------------------------------+ | 2 | + -------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
d、json_depth函数,json文件的深度,测试例子如下:
|
mysql> select json_depth( '{"aaa":1}' ),json_depth( '{}' ); + -------------------------+------------------+ | json_depth( '{"aaa":1}' ) | json_depth( '{}' ) | + -------------------------+------------------+ | 2 | 1 | + -------------------------+------------------+ 1 row in set (0.00 sec) mysql> select json_depth( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ); + --------------------------------------------------------------------------+ | json_depth( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ) | + --------------------------------------------------------------------------+ | 3 | + --------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
这里需要注意的是,形如{'aa':1}这种形式的json,其深度是2
e、json_contains_path函数检索json中是否有一个或者多个成员。
|
mysql> set @j= '{"a":1,"b":2,"c":{"d":4}}' ; Query OK, 0 rows affected (0.00 sec) #one的意思是只要包含一个成员,就返回1 mysql> select json_contains_path(@j, 'one' , '$.a' , '$.e' ); + ------------------------------------------+ | json_contains_path(@j, 'one' , '$.a' , '$.e' ) | + ------------------------------------------+ | 1 | + ------------------------------------------+ 1 row in set (0.00 sec) # all 的意思是所有的成员都包含,才返回1 mysql> select json_contains_path(@j, 'all' , '$.a' , '$.e' ); + ------------------------------------------+ | json_contains_path(@j, 'all' , '$.a' , '$.e' ) | + ------------------------------------------+ | 0 | + ------------------------------------------+ 1 row in set (0.01 sec) mysql> select json_contains_path(@j, 'one' , '$.c.d' ); + --------------------------------------+ | json_contains_path(@j, 'one' , '$.c.d' ) | + --------------------------------------+ | 1 | + --------------------------------------+ 1 row in set (0.00 sec) mysql> select json_contains_path(@j, 'one' , '$.a.d' ); + --------------------------------------+ | json_contains_path(@j, 'one' , '$.a.d' ) | + --------------------------------------+ | 0 | + --------------------------------------+ 1 row in set (0.00 sec) |
f、json_type函数,判断json中的成员的类型,需要和json_extract结合起来使用。
|
mysql> select * from test1; + ------+---------------------------------+ | id | info | + ------+---------------------------------+ | 1 | { "age" : 26, "name" : "yeyz" } | | 2 | { "age" : 30, "name" : "zhangsan" } | | 3 | { "age" : 35, "name" : "lisi" } | + ------+---------------------------------+ 3 rows in set (0.00 sec) #判断 name 的类型 mysql> select json_type(json_extract(info, "$.name" )) from test1; + ----------------------------------------+ | json_type(json_extract(info, "$.name" )) | + ----------------------------------------+ | STRING | | STRING | | STRING | + ----------------------------------------+ 3 rows in set (0.00 sec) #判断age的类型 mysql> select json_type(json_extract(info, "$.age" )) from test1; + ---------------------------------------+ | json_type(json_extract(info, "$.age" )) | + ---------------------------------------+ | INTEGER | | INTEGER | | INTEGER | + ---------------------------------------+ 3 rows in set (0.00 sec) #判断 name 和age组合起来的类型,可以看到是array mysql> select json_type(json_extract(info, "$.name" , "$.age" )) from test1; + ------------------------------------------------+ | json_type(json_extract(info, "$.name" , "$.age" )) | + ------------------------------------------------+ | ARRAY | | ARRAY | | ARRAY | + ------------------------------------------------+ 3 rows in set (0.00 sec) |
g、*的作用,所有的值,看下面的例子。
|
{ "a" :1, "b" :2, "c" : { "d" :4 } "e" : { "d" : { "ddd" : "5" } } } mysql> set @j= '{"a":1,"b":2,"c":{"d":4},"e":{"d":{"ddd":"5"}}}' ; Query OK, 0 rows affected (0.00 sec) #所有成员 mysql> select json_extract(@j, '$.*' ); + ---------------------------------------+ | json_extract(@j, '$.*' ) | + ---------------------------------------+ | [1, 2, { "d" : 4}, { "d" : { "ddd" : "5" }}] | + ---------------------------------------+ 1 row in set (0.00 sec) #所有成员中的d成员 mysql> select json_extract(@j, '$.*.d' ); + --------------------------+ | json_extract(@j, '$.*.d' ) | + --------------------------+ | [4, { "ddd" : "5" }] | + --------------------------+ 1 row in set (0.00 sec) |
以上就是MySQL中json字段的操作方法的详细内容,更多关于MySQL json字段的资料请关注开心学习网其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1558311
- mysql 触发器是什么(MySQL触发器的使用)
- mysql演示事务提交(MySQL找出未提交事务的SQL实例浅析)
- mysql的默认隔离级别(再有人问你MySQL的隔离级别是什么,就把这篇文章发给他!)
- mysql的四种关系运算(详解MySQL拼接函数CONCAT的使用心得)
- mysql百万数据分页查询优化方案(MySQL单表亿级数据分页怎么优化?)
- rename重命名mysql表(MySQL 重命名表的操作方法及注意事项)
- mysql 高级查询语法(MySQL查询语句进阶知识集锦)
- php添加数据到mysql数据库(PHP通过代码连接XAMPP数据库及MySQL数据库方法)
- mysql的limit的分页使用(获取 MySQL innodb B+tree 的高度的方法)
- cent os7.0 安装mysql(mysql8.0.23 linuxcentos7安装完整超详细教程)
- python对mysql数据分析(python使用adbapi实现MySQL数据库的异步存储)
- mysql拼接多字段作为查询条件(Mysql 实现字段拼接的三个函数)
- mysql常见的存储引擎(如何选择MySQL的存储引擎?)
- mysql数据库数据分析(详解MySQL数据库千万级数据查询和存储)
- 停止mysql服务命令(windows下实现定时重启Apache与MySQL方法)
- mysql主从复制延迟解决方案(关于mysql主备切换canal出现的问题解决)
- 红色代表什么(红色代表什么寓意)
- 蓝天代表什么(蓝天代表什么生肖)
- 今天要吃什么(今天要吃什么菜)
- 营养餐是什么(学校营养餐是什么)
- 谁说女子不如男 范冰冰演的武则天只是其一,另外两位你认识吗(谁说女子不如男)
- 杯酒人生---瓦伦丁酒杯和奥丁格啤酒(杯酒人生---瓦伦丁酒杯和奥丁格啤酒)
热门推荐
- MySQL配置文件my.cnf的介绍
- wget 命令下载压缩包(wget下载整个网站整个子目录或特定目录)
- linux系统安装宝塔面板启动失败(Linux云主机安装宝塔面板新手教程)
- dedecms搜索功能怎么设置详细(织梦Dedecms软件频道下载次数真实显示的权宜修改)
- laravel5开发规范(laravel5.1框架基础之路由详解)
- python的模块与包与库(Python 中包/模块的 `import` 操作代码)
- dockerrun执行脚本(docker run和start的区别说明)
- 微信公众号怎么申请支付接口(微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解)
- electronvue最新版本(Vue3和Electron实现桌面端应用详解)
- 还原NuGet程序包
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9