1、json对象

1.1、方法

  1. 使用对象操作的方法进行查询:字段->'$.json属性'
  2. 使用函数进行查询:json_extract(字段, '$.json属性')
  3. 获取JSON数组/对象长度:JSON_LENGTH()

1.2、数据

CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`goods_sn` varchar(25) NOT NULL DEFAULT '' COMMENT '商品编码',
`desc_attr` json NOT NULL COMMENT '描述属性',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='TEST'; INSERT INTO `test`.`test`(`id`, `goods_sn`, `desc_attr`) VALUES (1, 'A0001', '{\"tag\": [\"GRS\", \"GOTS\"], \"size\": \"M\", \"color\": \"红色\", \"material\": \"尼龙\"}');
INSERT INTO `test`.`test`(`id`, `goods_sn`, `desc_attr`) VALUES (2, 'A0002', '{\"tag\": [\"GRS\", \"GOTS\", \"MTD\"], \"size\": \"LA\", \"color\": \"黄色\", \"material\": \"纯棉\"}');
{
"tag": ["GRS", "GOTS"],
"size": "M",
"color": "红色",
"material": "尼龙"
}

1.3、查询

-- 查询面料不为空的商品
select * from test where desc_attr->'$.material' is not null;
select * from test where JSON_EXTRACT(desc_attr, '$.material') is not null; -- 查询面料为纯棉的商品
select * from test where desc_attr->'$.material'='纯棉';
select * from test where JSON_EXTRACT(desc_attr, '$.material')='纯棉'; -- 查询标签数量大于2的商品
select * from test where JSON_LENGTH(desc_attr->'$.tag')>2;

2、json数组

2.1、方法

  1. 对象操作方式查询:字段->'$[0].属性'
  2. 使用函数查询:JSON_CONTAINS(字段,JSON_OBJECT('json属性', '内容'))
  3. 获取JSON数组/对象长度:JSON_LENGTH()

2.2、数据

CREATE TABLE `test2` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`goods_sn` varchar(25) NOT NULL DEFAULT '' COMMENT '商品编码',
`desc_attrs` json NOT NULL COMMENT '描述属性,多个',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='TEST2'; INSERT INTO `test`.`test2`(`id`, `goods_sn`, `desc_attrs`) VALUES (1, 'A0001', '[{\"tag\": [\"GRS\", \"GOTS\"], \"size\": \"M\", \"color\": \"红色\", \"material\": \"尼龙\"}, {\"tag\": [\"GRS\", \"GOTS\", \"MTD\"], \"size\": \"LA\", \"color\": \"黄色\", \"material\": \"纯棉\"}]');
INSERT INTO `test`.`test2`(`id`, `goods_sn`, `desc_attrs`) VALUES (2, 'A0002', '[{\"tag\": [\"GRS\", \"GOTS\"], \"size\": \"M\", \"color\": \"红色\", \"material\": \"尼龙\"}, {\"tag\": [\"GRS\", \"GOTS\", \"MTD\"], \"link\": \"xxx\", \"size\": \"LA\", \"color\": \"黄色\", \"material\": \"纯棉\"}]');
INSERT INTO `test`.`test2`(`id`, `goods_sn`, `desc_attrs`) VALUES (3, 'A0003', '[]');
[
{
"tag":["GRS", "GOTS"],
"size":"M",
"color":"红色",
"material":"尼龙"
},
{
"tag":["GRS", "GOTS", "MTD"],
"size":"LA",
"color":"黄色",
"material":"纯棉"
}
]

2.3、查询

-- 查询描述属性不为空的商品
select * from test2 where JSON_LENGTH(desc_attrs) > 0; -- 查询第1项存在颜色属性的商品
select * from test2 where desc_attrs->'$[0].color' is not null; -- 查询任意项存在链接属性的商品
select * from test2 where desc_attrs->'$[*].link' is not null; -- 查询任意项存在链接等于xxx属性的商品
select * from test2 where JSON_CONTAINS(desc_attrs,JSON_OBJECT('link', 'xxx'));
注意
copy-- [{"link":"xxx"}]
select desc_attrs->'$[*].link' from test2 where id=2;
-- 查询结果为`["xxx"]`
-- 返回每一项的link,所以是个数组

为JSON格式的数据添加索引

* 在Mysql 5.7.8中,MySQL支持由RFC 7159定义的本地JSON数据类型,它支持对JSON(javascript对象标记)文档中的数据进行有效访问.

  * MySQL会对DML JSON数据自动验证。无效的DML JSON数据操作会产生错误.

优化的存储格式。存储在JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问.

* MySQL Json类型支持通过虚拟列方式建立索引,从而增加查询性能提升.

创建Json索引表 json_key [ name 为虚拟列, virtual 表明不占用磁盘空间 ]

   [ GENERATED ALWAYS 与 VIRTUAL可以不写 ]

指定获取json中的name key

CREATE TABLE json_key(
-> uid BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
-> data JSON NOT NULL,
-> name VARCHAR(32) GENERATED ALWAYS AS (json_extract(data, '$.name')) VIRTUAL
-> )ENGINE=INNODB CHARSET=utf8mb4;

创建虚拟列name索引

alter table users add key (name);

插入数据带 data中name key [ 插入数据时需要显示指定非虚拟列 ]

INSERT INTO json_key(uid, data) SELECT NULL, JSON_OBJECT('name', 'tom', 'sex', 'male', 'age', '26');

插入数据不带 data中name key

INSERT INTO json_key(uid, data) SELECT NULL, JSON_OBJECT('sex', 'female', 'age', '29');

通过json方法查询

explain select * from json_key where json_extract(data, '$.name') = 'tom'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: json_key
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 2
filtered: 100.00
Extra: Using where

通过虚拟列查询

explain select * from json_key where name = 'tom'\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: users

   partitions: NULL

         type: ref

possible_keys: name

          key: name

      key_len: 1023

          ref: const

         rows: 1

     filtered: 100.00

        Extra: NULL
使用汇总:
[数组]

-- 查询第一个标签为测量的记录
select tags, JSON_EXTRACT(tags, '$[0]') as first_tag from data where JSON_EXTRACT(tags, '$[0]') = '测量'; select tags, JSON_EXTRACT(tags, '$[0]') as first_tag from data where tags->'$[0]' = '测量'; -- 查询该字段所有内容
select tags, JSON_EXTRACT(tags, '$[*]') as all_tag from data ; -- 字段中元素个数
select tags, JSON_EXTRACT(tags, '$[0]') as first_tag, JSON_LENGTH(tags) from data ;
-- 元素中包含某个元素
select * from ai_volc_template_data where JSON_CONTAINS(tags, '"测量"'); -- 注意需要引号


mysql5.7之JSON数据类型的更多相关文章

  1. MySQL 5.7 深度解析: JSON数据类型使用

    http://www.actionsky.com/docs/archives/156  2015年12月25日  杨涛涛 JSON (JavaScriptObject Notation) 是一种轻量级 ...

  2. iOS NSDictionary、NSData、JSON数据类型相互转换

    iOS经常需要用到数据类型的转换,下面列举一下常用类型的转换. 1.NSDictionary类型转换为NSData类型: //NSDictionary -> NSData: NSDictiona ...

  3. springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用

    springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用 主要内容: 这篇文章主要是总结之前使用springmv接收json的时候遇到的问题,下面通过前台发送a ...

  4. mysql数据库中,如何对json数据类型的值进行修改?通过json_set函数对json字段值进行修改?

    需求描述: 今天在看mysql中存放json数据类型的问题,对于json数据进行修改的操作, 在此记录下. 操作过程: 1.创建包含json数据类型的表,插入基础数据 mysql> create ...

  5. mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?

    需求描述: 在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create ...

  6. json 数据类型,后台在组数据时,错一个标点符号,前端都解析不出来。

    json 数据类型,后台在组数据时,错一个标点符号,前端都解析不出来.

  7. MySQL 5.7新增加的json数据类型

    MySQL 5.7中有json存储类型了以前我们只能通过php来进行序列化了不过现在就不需要了我们可以直接使用MySQL 5.7的json数据类型来存储json格式数据了,具体来看介绍.   在MyS ...

  8. 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5.7.8 开始支持的.在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档. 相对字符类型,原生的 JSON 类型具有以下优 ...

  9. requests---requests发送json数据类型

    我们都知道post请求中的body有4种数据类型,今天我们来写一篇关于requests请求json这种数据类型. 数据类型 我们都知道post和get有个大的区别就是get没有body而post存在b ...

  10. django学习-16.返回给前端页面数据为json数据类型的3种方案

    目录结构 1.前言 2.JsonResponse类的源码简单分析 2.1.JsonResponse类的源码如下所示 2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用 3.[方案 ...

随机推荐

  1. 【YashanDB知识库】数据变化率超过阈值统计信息失效

    [问题分类]性能优化 [关键字]统计信息 [问题描述] SQL --创建表结构 drop table t1; create table t1 (id int,name varchar2(200)); ...

  2. LeetCode 二叉树的最近公共祖先

    一.二叉搜索树的最近公共祖先 利用二叉搜索树的性质,祖先的两个孩子,左孩子的小于根节点的值,右孩子大于根节点的值. 如果根节点的值,同时大于p的值和q的值,那么在左子树找根节点: 如果根节点的值,同时 ...

  3. Nuxt Kit 的使用指南:从加载到构建

    title: Nuxt Kit 的使用指南:从加载到构建 date: 2024/9/12 updated: 2024/9/12 author: cmdragon excerpt: 摘要:本文详细介绍了 ...

  4. HTML – Native Form 原生表单功能集

    前言 以前写过 form 表单, 但很不齐全, 这篇想做一个大整理. 主要讲讲在网站中使用原生 Form 的功能, 不足和扩展. 前端是原生的 HTML/JS, 后端是 ASP.NET Core Ra ...

  5. LiveChat vs LiveAgent vs Front vs Email

    它们是什么? LiveChat, LiveAgent 算是同类产品. LiveChat 的核心(或者说起点)是 live chat 这个功能, 而 LiveAgent 的核心是 ticket. 如果拿 ...

  6. SQL Server的Descending Indexes降序索引

    SQL Server的Descending Indexes降序索引 背景索引是关系型数据库中优化查询性能的重要手段之一.对于需要处理大量数据的场景,合理的索引策略能够显著减少查询时间. 特别是在涉及多 ...

  7. RabbitMQ协议基础及C++和Java混合开发

    目前面对大多数的需要在异构系统间进行消息传递技术路线,大多会选择socket或webservice.这两种技术的共同特点是耦合紧,调试依赖双方同步,但是效率高.除此以外,使用消息队列(MQ)的应用场景 ...

  8. DOM 的事件流

    事件流分为三个阶段:捕获 ==>目标 ==>冒泡 1. 事件捕获阶段:事件传播由目标节点的祖先节点逐级传播到目标节点.先由文档的根 节点 document(window)开始触发对象,最后 ...

  9. Vue 的最大优势是???

    Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.另一方面,当与现代 ...

  10. These dependencies were not found: * core-js/modules/es.array.push.js in ./node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js

    yarn add core-js  安装core-js包 : 出现这个问题的原因:因为vue-admin-template的package.json里没写这个包core-js,然后再咱们yarn装包的 ...