MySQL 5.7的原生JSON数据类型使用

MySQL 5.7的原生JSON数据类型使用

大家好,又见面了,我是全栈君。

新增测试用表:

CREATE TABLE lnmp (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `category` JSON,
    `tags` JSON,
    PRIMARY KEY (`id`)
);

新增数据

INSERT INTO `lnmp` (category, tags) VALUES ('{"id": 1, "name": "lnmp.cn"}', '[1, 2, 3]');

INSERT INTO `lnmp` (category, tags) VALUES (JSON_OBJECT("id", 2, "name", "php.net"), JSON_ARRAY(1, 3, 5));

分别是两种不同的方式新增

查询:

显示json格式内部字段:

SELECT id, category->'$.id', category->'$.name', tags->'$[0]', tags->'$[2]' FROM lnmp;

去除掉默认双引号:

SELECT id, category->'$.name', JSON_UNQUOTE(category->'$.name'), category->>'$.name' FROM lnmp;

 

条件查询:

SELECT * FROM lnmp WHERE category = CAST('{"id": 1, "name": "lnmp.cn"}' as JSON);

必须使用cast转换为json类型

如果不转换就相当于查询String,是查询不到数据的。

使用json内属性进行条件查询:

SELECT * FROM lnmp WHERE category->'$.name' = 'lnmp.cn';

SELECT * FROM lnmp WHERE category->>'$.name' = 'lnmp.cn';

两种皆可

要特别注意的是,JSON 中的元素搜索是严格区分变量类型的,比如说整型和字符串是严格区分的

SELECT * FROM lnmp WHERE category->'$.id' = 1;

除了用 column->path 的形式搜索,还可以用JSON_CONTAINS 函数,但和 column->path 的形式有点相反的是,JSON_CONTAINS 第二个参数是不接受整数的,无论 json 元素是整型还是字符串,否则会出现这个错误

SELECT * FROM lnmp WHERE JSON_CONTAINS(category, '1', '$.id');

对于数组类型的 JSON 的查询,比如说 tags 中包含有 2 的数据,同样要用 JSON_CONTAINS 函数,同样第二个参数也需要是字符串

SELECT * FROM lnmp WHERE JSON_CONTAINS(tags, '2');

更新JSON:

UPDATE lnmp SET tags = '[1, 3, 4]' WHERE id = 1;

但如果要更新 JSON 下的元素,MySQL 并不支持 column->path 的形式

则可能要用到以下几个函数

JSON_INSERT() 插入新值,但不会覆盖已经存在的值

UPDATE lnmp SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;

可以看到 name 没有被修改,但新元素 url 已经添加进去

JSON_SET() 插入新值,并覆盖已经存在的值

UPDATE lnmp SET category = JSON_SET(category, '$.host', 'www.lnmp.cn', '$.url', 'http://www.lnmp.cn') WHERE id = 1;

可以看到 host 已经插入,url 已经被修改

JSON_REPLACE() 只替换存在的值

UPDATE lnmp SET category = JSON_REPLACE(category, '$.name', 'php', '$.url', 'http://www.php.net') WHERE id = 2;

可以看到 name 已经被替换,url 不存在被忽略。

JSON_REMOVE() 删除 JSON 元素

UPDATE lnmp SET category = JSON_REMOVE(category, '$.url', '$.host') WHERE id = 1;

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问

    配置Docker阿里云镜像加速服务登录阿里云账号,进入控制台->容器镜像服务(不需要有阿里云的服务器,只要注册账号即可)在两台node节点上配置好阿里云的镜像加速。重启一下dockersudosystemctlrestartdocker重启一下k8ssystemctlstartkubelet部署Tomcat集群方法1:使用可视化界面部署tomcat集群dashboard->工作负载->创建->创建应用稍等几分钟之后,

    2022年4月7日
    42
  • 【六】Hystrix Dashboard

    【六】Hystrix Dashboard

    2021年7月1日
    80
  • word——VBA编程「建议收藏」

    word——VBA编程「建议收藏」最近需要批量操作一些word文件,大约四十几个文件把。一个一个手动操作真的太low了,所以研究了一下word的宏,VBA编写代码,批量操作。Sub批量操作WORD()DimpathAsStringDimFileNameAsStringDimworddocAsDocumentDimMyDirAsStringMyDir=”…

    2022年4月30日
    343
  • Intellij IDEA第一个java applet程序

    Intellij IDEA第一个java applet程序建好项目之后配置configuration目录结构如下game.htmlmyGame.java运行后显示试着编译myGame.java还是没用这里顺带提一下如何编译myGame.javacmd进入src文件夹,执行命令javacmyGame.java即可在同文件夹生成myGame.class文件如果提示javac不是外部或内部指令按下篇文章进行设置https://jingyan.baidu.com/article/08b6a591bdb18314a80922a0.html回

    2022年7月8日
    59
  • pycharm看不到运行结果_pycharm系统找不到路径

    pycharm看不到运行结果_pycharm系统找不到路径一、起因不知道什么原因,好像是在下载安装了Java8.jdk后吧,浏览器的下载文件夹似乎被洗劫了一下那两个不是幸存了,是重下回来了…二、问题出现这个图虽然不是我的,但问题类型是一样的截图来自另一位大佬的解决办法:​​​​​​pycharm无法运行?系统找不到指定的文件?解决办法及其中的一个小坑_unseven的博客-CSDN博客_pycharm运行找不到指定文件四、奇妙地解决右键开始窗口打开应用和功能,下滑找到程序和功能进一步找到python右…

    2022年8月27日
    6
  • 彻底解决mysql报错:1030, ‘Got error 28 from storage engine‘

    彻底解决mysql报错:1030, ‘Got error 28 from storage engine‘恕我直言,网上文章千篇一律,没一个能解决的,全是说清一下内存就好了,但是并没有教不会的小白清理…==这个问题确实是服务器系统盘满了,mysql指定的临时文件目录满掉,大概就是这个意思.下面解决/dev/vda1系统盘满了,其实我压根不知道/dev/vda1这在哪,是什么,后来了解这是virtio-block类型的设备。科普一下:以’c’开头的一行表示该设备是一个……

    2022年10月21日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号