首页 > 数据库 >mysql8之json/数组的增删改查

mysql8之json/数组的增删改查

时间:2023-05-14 16:22:59浏览次数:55  
标签:category goods name mysql8 改查 JSON json attrs

前言,类型必须是json,虽然text也可以,但是很多操作没法使用,比如查询,当然了,这种类型还可以存储数组类似 varchar,设置 JSON 主要将字段的 type 是 json, 不能设置长度,可以是 NULL 但不能有默认值。
创建json

  • json_array 创建json数组
  • json_object 创建json对象

查询json

  • json_contains 判断是否包含某个json值
  • column->>path json_unquote(column -> path)的简洁写法
  • json_keys 提取json中的键值为json数组
  • json_search 按给定字符串关键字搜索json,返回匹配的路径

修改json

  • json_array_append 末尾添加数组元素,如果原有值是数值或json对 象,则转成数组后,再添加元素
  • json_array_insert 插入数组元素
  • json_insert 插入值(插入新值,但不替换已经存在的旧值)
  • json_merge 合并json数组或对象
  • json_remove 删除json数据
  • json_replace 替换值(只替换已经存在的旧值)
  • json_set 设置值(替换旧值,并插入不存在的新值)
  • json_unquote 去除json字符串的引号,将值转成string类型

返回json属性

  • json_depth 返回json文档的最大深度
  • json_length 返回json文档的长度
  • json_type 返回json值得类型
  • json_valid 判断是否为合法json文档

MySQL 也有专门的函数 JSON_OBJECTJSON_ARRAY 生成 json 格式的数据,但是吧,使用的时候有注意点,尽量之间写进去吧

//JSON_OBJECT必须是偶数,嵌套时必须搭配JSON_ARRAY
 INSERT INTO `a_goods` (`attrs`, `type`) 
 VALUES (
 JSON_OBJECT("name","张三","age",20,"strage","20","data",JSON_ARRAY("新品","热销",1,"0")), 
 JSON_ARRAY("新品","热销",1,"0")
 ) 

查询
一般对应字符串类型的 category->’$.name’ 中还包含着双引号,这其实并不是想要的结果,可以用 JSON_UNQUOTE 函数将双引号去掉,从 MySQL 5.7.13 起也可以通过这个操作符 * ->> *这个和 JSON_UNQUOTE 是等价的,查询json的值,即键的值。

SELECT attrs->'$.name' as name, JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods
/*
  SELECT 
    attrs->'$.name' as name,    查询json数据中的name的值并赋值给name
    JSON_UNQUOTE(attrs->'$.name'),
    attrs->>'$.name' 
 FROM a_goods
*/

json中的where 语句。

SELECT * FROM a_goods WHERE type = CAST('["新品","热销",1,"0"]' as JSON)
//查询json是否在数据库的存在,其实就相当于 `where a=1` 只不过这个a得转换一下
//CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型
SELECT * FROM a_goods WHERE attrs->>'$.age' = '20' 
//要特别注意的是,JSON 中的元素搜索是严格区分变量类型的,比如说整型和字符串是严格区分的,即 “20”和20
SELECT * FROM a_goods WHERE JSON_CONTAINS(attrs, '20', '$.age')
SELECT * FROM a_goods WHERE JSON_CONTAINS(type, '"新品"')
//用JSON_CONTAINS 函数,但和 *column->path *的形式有点相反的是,JSON_CONTAINS 第二个参数是不接受整数的,无论 json 元素是整型还是字符串,否则会出现错误

更新
更新数组按以往的更新就行

    UPDATE a_goods SET type = '["demo","0",1]'

但如果要更新 JSON 下的元素,MySQL 并不支持 *column->path *的形式,则可能要用到以下几个函数
JSON_INSERT() 插入新值,但不会覆盖已经存在的值

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

但如果要更新 JSON 下的元素,MySQL 并不支持 *column->path *的形式,则可能要用到以下几个函数
JSON_INSERT() 插入新值,但不会覆盖已经存在的值,修改的是JSON对象

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

JSON_SET() 插入新值,并覆盖已经存在的值,修改的是JSON对象

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

JSON_REPLACE() 只替换存在的值,修改的是JSON对象

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

JSON_REMOVE() 删除 JSON 元素,修改的是JSON对象,可以删除多个JSON值

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

总结:以上是JSON对象和JSON数组的多个MySQL8函数的总结

标签:category,goods,name,mysql8,改查,JSON,json,attrs
From: https://www.cnblogs.com/jelly12345/p/17399487.html

相关文章

  • MySQL8JSON数组函数之json_array_append、json_array_insert
    json_array_append、json_array_insert顾名思义就是向数组中追加和插入值,因为没有找到合适的例子,所以就使用官方的例子进行说明1、json_array_append向指定的位置后追加值,查询和修改的函数如下所示:updatetest_jsonsettest_json_array=json_array_append(test_json_array,......
  • mysql8 json 索引总结
    表结构如下所示:CREATETABLE`test_json`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(32)NOTNULL,`age`intNOTNULL,`test_json_array`jsonNOTNULL,`test_json_object`jsonNOTNULL,`test_json_array_object`jsonNOTNULL,`custinfo......
  • MySQL8之JSON_OVERLAPS、JSON_CONTAINS
    表结构如下所示:CREATETABLE`test_json`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(32)NOTNULL,`age`intNOTNULL,`test_json_array`jsonNOTNULL,`test_json_object`jsonNOTNULL,`test_json_array_object`jsonNOTNULL,`custinfo......
  • MySQL8版本之json_keys、json_object、json_overlaps、json_pretty
    CREATETABLE`test_json`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(32)NOTNULL,`age`intNOTNULL,`test_json_array`jsonNOTNULL,`test_json_object`jsonNOTNULL,`test_json_array_object`jsonNOTNULL,`custinfo`jsonDEFAU......
  • Java:SpringBoot整合MyBatis-Plus实现MySQL数据库的增删改查
    MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。文档https://baomidou.com/目录一、引入坐标二、配置三、CURD测试四、API数据接口一、引入坐标<dependency><groupId>com.baomidou</groupId><artifactId>m......
  • 获取compile_commands.json的方式
    CMake工程这个最简单,在CMakeLists.txt中加set(CMAKE_EXPORT_COMPILE_COMMANDSon),或者在cmake的命令中加-DCMAKE_EXPORT_COMPILE_COMMANDS.即可产生CMakefileMakefile借助compiledb程序可以生成compile_commands.json文件。compiledb-nmake-f/path/to/Makefile#......
  • 常用模块,time,random,json,os
    模块底层都是c语言写的模块的分类内置模块,不需要自己安装,直接拿过来用扩展模块,第三方模块,需要自己安装本地编辑器安装小白教程(forchange.cn)random随机数.random()不入参,求(0,1)之间的随机数,开区间.randint(a,b)求随机整数,闭区间[a,b].randrange(start,stop,step......
  • com-alibaba-fastjson转换json时默认将属性第一个字母转小写
    问题描述将实体类对象转为json字符串的时候,会将属性名首字母改为小写例如此出User队形有两个属性,USER_NAME和USER_AGE,首字母均为大写将实体类对象转为JSON后首字母全都转换为了小写解决方法这是因为阿里巴巴的fastjson框架默认使用了JavaBean规范中的命名约定,将属性名首字......
  • macos13 m1 安装 mysql8.0.32
    1、下载安装包选择MySQLCommunityServer版本MySQL::DownloadMySQLCommunityServer(ArchivedVersions)2、可视化安装选择强密码策略3、环境变量配置cat.zshrcexportPATH=$PATH:/usr/local/mysql-8.0.32-macos13-arm64/binexportPATH=$PATH:/usr/local/mysq......
  • Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法
    一、问题描述最近在开发后端接口时,发现返回结构中,一个字段大小写转化有问题。lombok版本:1.18.14VO对象如下,字段为echarts趋势图组件。预期返回xAxis,实际返回xaxis@DatapublicclassULineBarVO{/***X轴信息*/privateULineBarDataVOxAxis;/*......