体验 MySQL 8.0 JSON聚合函数
时间:2022-05-07
本文章向大家介绍体验 MySQL 8.0 JSON聚合函数,主要内容包括基础用法、添加测试数据、在查询中使用聚合函数、场景示例、需求、实现、小结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
MySQL 最近的动作很快,已经计划推出 8.0 版本,会新增很多新特性
在 5.7 中,JSON 已经被正式支持,但在 SQL 中对 JSON 的处理能力较弱,8.0 中这部分能力会加强,例如新增了这两个JSON聚合函数
JSON_ARRAYAGG()
JSON_OBJECTAGG()
通过JSON聚合函数,可以在 SQL 中直接把数据整合为JSON结构,非常简单
基础用法
创建测试表
CREATE TABLE `t1` (
`key` varchar(8) DEFAULT NULL,
`grp` varchar(8) DEFAULT NULL,
`val` varchar(8)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
添加测试数据
INSERT INTO t1(`key`, `grp`, `val`) VALUES
("key1", "g1", "v1"),
("key2", "g1", "v2"),
("key3", "g2", "v3");
在查询中使用聚合函数
把字段 ‘key’ 的所有值整合为一个JSON数组
mysql> SELECT JSON_ARRAYAGG(`key`) AS `keys` FROM t1;
+--------------------------+
| keys |
+--------------------------+
| ["key1", "key2", "key3"] |
+--------------------------+
1 row in set (0.00 sec)
分组聚合
mysql> SELECT grp, JSON_ARRAYAGG(`key`) AS `keys_grouped` FROM t1 GROUP BY grp;
+------+------------------+
| grp | keys_grouped |
+------+------------------+
| g1 | ["key1", "key2"] |
| g2 | ["key3"] |
+------+------------------+
2 rows in set (0.00 sec)
mysql> SELECT grp, JSON_OBJECTAGG(`key`, val) AS `key_val_grouped` FROM t1 GROUP BY grp;
+------+------------------------------+
| grp | key_val_grouped |
+------+------------------------------+
| g1 | {"key1": "v1", "key2": "v2"} |
| g2 | {"key3": "v3"} |
+------+------------------------------+
2 rows in set (0.00 sec)
把某两列的值整合为JSON对象
mysql> SELECT JSON_OBJECTAGG(`key`, val) AS `key_val` FROM t1;
+------------------------+
| key_val |
+------------------------+
| {
"key1": "v1",
"key2": "v2",
"key3": "v3"
} |
+------------------------+
1 row in set (0.00 sec)
场景示例
描述
例如一个产品表,其中包含产品的通用属性(名称、价格...)
产品还有自己的单独属性,例如 电脑会包含 cpu/内存 等型号、衣服会包含 颜色、材质 等
引申出另外两张表:扩展属性表、属性值表
需求
查询出产品的所有信息,包括所有属性及其值,并整合为JSON结构
实现
建表
// 产品表
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(120) DEFAULT NULL,
`manufacturer` varchar(120) DEFAULT NULL,
`price` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
// 扩展属性表
CREATE TABLE `attribute` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(120) DEFAULT NULL,
`description` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
// 属性值表
CREATE TABLE `value` (
`prod_id` int(11) NOT NULL,
`attribute_id` int(11) NOT NULL,
`value` text,
PRIMARY KEY (`prod_id`,`attribute_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
添加测试数据
// 插入一些属性
INSERT INTO attribute(id, name) VALUES
(1, "color"),
(2, "material"),
(3, "style"),
(4, "bulb_type"),
(5, "usage"),
(6, "cpu_type"),
(7, "cpu_speed"),
(8, "weight"),
(9, "battery_life"),
(10, "fuel_type");
// 插入一个产品:台灯
INSERT INTO product(id, name, manufacturer, price) VALUES
(1, "LED Desk Lamp", "X", 26);
// 插入台灯对应的属性值
INSERT INTO value VALUES
(1, 1, "black"),
(1, 2, "plastic"),
(1, 3, "classic"),
(1, 4, "LED"),
(1, 5, "Indoor use only");
// 插入一个产品:电脑
INSERT INTO product(id, name, manufacturer, price) VALUES
(2, "Laptop", "Y", 800);
// 插入电脑对应的属性值
INSERT INTO value VALUES
(2, 1, "blue"),
(2, 6, "quad core"),
(2, 7, "3400 mhz"),
(2, 8, "2,1 kg"),
(2, 9, "9h");
// 插入一个产品:烧烤架
INSERT INTO product(id, name, manufacturer, price) VALUES
(3, "Grill", "Z", 300);
// 插入对应属性值
INSERT INTO value VALUES
(3, 1, "black"),
(3, 8, "5 kg"),
(3, 10, "gas");
查询
// 关联3张表,按产品ID分组
// 把查询结果聚合为JSON对象
SELECT
JSON_OBJECT("key", p.id,
"title", p.name,
"manufacturer", p.manufacturer,
"price", p.price,
"specifications", JSON_OBJECTAGG(a.name, v.value)) as product
FROM
product as p JOIN value as v
ON p.id=v.prod_id
JOIN attribute as a
ON a.id=v.attribute_id
GROUP BY v.prod_id;
结果示例
{
"key": 1,
"price": 26,
"title": "LED Desk Lamp",
"manufacturer": "X",
"specifications": {
"color": "black",
"style": "classic",
"usage": "Indoor use only",
"material": "plastic",
"bulb_type": "LED"
}
}
......
小结
本文整理自:
http://mysqlserverteam.com/mysql-8-0-labs-json-aggregation-functions
MySQL 8 实验版本下载地址:
https://labs.mysql.com/
(选择 MySQL Server 8.0.0 Optimizer)
- 全系统栈崩溃是什么鬼?手机管家高级工程师 jaylin,教你如何抓鬼!
- 【团队分享】苍翼之刃:论File Descriptor泄漏如何导致Crash?
- 【沙龙干货分享】你要知道的N个Android适配问题
- 优化安卓应用内存的神秘方法以及背后的原理,一般人我不告诉他
- 安全快速下载Xcode的姿势
- Android之实现妙趣横生的粘连布局
- 萝莉有话说:你的App真正适配了iOS 9吗?
- H5 缓存机制浅析 移动端 Web 加载性能优化
- Android 开发必备知识:我和 Gradle 有个约会
- dex分包变形记
- 手把手教你如何分析 iOS 系统栈 crash
- 通往全栈工程师的捷径 —— React
- GLC - glog 日志清理类库
- Go发起Http请求及获取相关参数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 轻松应对并发问题,简易的火车票售票系统,第一步 —业务分析
- 【Spark Operator】核数设置Cores/Cores Limit/Cores Request,你搞清楚没有?
- 【Ceph RGW】radosgw_usage_exporter监控用户使用量
- 【Goland】#{key}=#{value},字符串被格式化了?
- Variable变量
- 案例:OGG目标端进程ABENDED处理
- Elasticsearch深分页以及排序查询问题
- 聊聊dubbo-go的HystrixFilter
- 如何将Java工程导出成可以执行的jar
- 利用JSP内置的Application对象实现的网站引用计数
- JSP导入XML不成功的一个原因
- 生产环境日志清理脚本
- fastadmin插件开发之插件目录
- EasySwoole之定时任务面板
- Gradle构建springBoot项目