请解释JSON_ARRAYAGG与JSON_ARRAY的核心差异、示例及适用场景
JSON_ARRAY与JSON_ARRAYAGG的核心差异(通俗版)
本质区别
- JSON_ARRAY是「单条记录的打包工具」:你给它几个值(字段、常量都行),它就把这些值拼成一个JSON数组,每条输入记录对应一条带数组的输出记录,不会合并多条数据。
- JSON_ARRAYAGG是「多行数据的聚合工具」:它会把查询结果中多行的某个字段值,合并成一个大的JSON数组,多行输入对应一行(或按分组的每行)输出。
实战示例(以MySQL为例)
假设我们有一张users表,数据如下:
| id | name | department |
|---|---|---|
| 1 | Alice | 研发部 |
| 2 | Bob | 市场部 |
| 3 | Charlie | 研发部 |
| 4 | David | 市场部 |
1. JSON_ARRAY的用法
需求:把每个用户的ID、姓名、部门打包成一个JSON数组
SELECT id, name, JSON_ARRAY(id, name, department) AS user_info FROM users;
输出结果:
| id | name | department | user_info |
|---|---|---|---|
| 1 | Alice | 研发部 | [1, "Alice", "研发部"] |
| 2 | Bob | 市场部 | [2, "Bob", "市场部"] |
| 3 | Charlie | 研发部 | [3, "Charlie", "研发部"] |
| 4 | David | 市场部 | [4, "David", "市场部"] |
可以看到,每条用户记录都生成了独立的数组,完全是单条记录内部的打包。
2. JSON_ARRAYAGG的用法
场景1:按部门分组,汇总每个部门的成员姓名
SELECT department, JSON_ARRAYAGG(name) AS department_members FROM users GROUP BY department;
输出结果:
| department | department_members |
|---|---|
| 研发部 | ["Alice", "Charlie"] |
| 市场部 | ["Bob", "David"] |
这里把同一部门的多行姓名,合并成了一个数组,是跨记录的聚合操作。
场景2:汇总所有用户的姓名成一个数组
SELECT JSON_ARRAYAGG(name) AS all_users FROM users;
输出结果:
| all_users |
|---|
| ["Alice", "Bob", "Charlie", "David"] |
直接把整个表的name字段值,聚合为一个单独的JSON数组。
适用场景
JSON_ARRAY适合:
- 需要把单条记录里的多个字段/常量组合成JSON数组,比如接口返回时把用户的基础信息打包成一个字段;
- 构造固定结构的JSON数组常量(比如
JSON_ARRAY(1,2,3)直接生成[1,2,3])。
JSON_ARRAYAGG适合:
- 按分组统计某类数据的集合,比如每个班级的学生名单、每个订单的商品列表;
- 需要把查询结果的某一列整体打包成一个数组返回,比如获取系统所有用户的ID列表。
内容的提问来源于stack exchange,提问作者Roman Ieromenko
相关产品推荐
相关产品推荐

