一、基本概念
GROUP_CONCAT
是 MySQL 专属的聚合函数,核心作用是 将分组(GROUP BY
后)的多行数据,按规则拼接成单个字符串 ,常用于合并同组的关联信息,让结果更简洁直观,比如把同一用户的多个订单号合并展示。
二、语法结构
GROUP_CONCAT(
[DISTINCT] 要拼接的字段/表达式
[ORDER BY 排序字段/表达式 [ASC/DESC]]
[SEPARATOR '自定义分隔符']
)
结合 GROUP BY
使用,完整查询语法:
SELECT 分组字段,
GROUP_CONCAT(...) AS 别名
FROM 表名
GROUP BY 分组字段;
三、关键参数解析
参数 | 作用说明 | 示例场景 |
| 可选,对拼接内容去重,避免重复值干扰 | 合并同一用户的不同订单号(去重重复订单) |
| 必填,指定需合并的列,也能通过 |
|
| 可选,控制拼接前数据的排序,让结果按规律排列 | 按时间倒序拼接操作日志 |
| 可选,默认用逗号( | 用 |
四、基础用法示例
假设有表 orders
,结构和数据:
order_id | product |
1 | Apple |
1 | Orange |
2 | Banana |
3 | Apple |
1. 最简拼接(默认逗号分隔)
SELECT order_id,
GROUP_CONCAT(product) AS products
FROM orders
GROUP BY order_id;
结果:
order_id | products |
1 | Apple,Orange |
2 | Banana |
3 | Apple |
2. 自定义分隔符(用 ,
分隔)
SELECT order_id,
GROUP_CONCAT(product SEPARATOR ', ') AS products
FROM orders
GROUP BY order_id;
结果:
order_id | products |
1 | Apple, Orange |
2 | Banana |
3 | Apple |
3. 排序后拼接(按 product
升序)
SELECT order_id,
GROUP_CONCAT(product ORDER BY product ASC SEPARATOR ', ') AS products
FROM orders
GROUP BY order_id;
结果(因原数据已天然有序,效果同示例 2,若数据混乱则体现排序作用):
order_id | products |
1 | Apple, Orange |
2 | Banana |
3 | Apple |
4. 去重拼接(若有重复 product
会去重)
假设 order_id=1
有重复 Apple
,数据变为:
order_id | product |
1 | Apple |
1 | Apple |
1 | Orange |
2 | Banana |
3 | Apple |
用 DISTINCT
去重:
SELECT order_id,
GROUP_CONCAT(DISTINCT product ORDER BY product ASC SEPARATOR ', ') AS products
FROM orders
GROUP BY order_id;
结果:
order_id | products |
1 | Apple, Orange |
2 | Banana |
3 | Apple |
五、进阶场景扩展
1. 拼接复杂表达式(结合 CONCAT
构造格式)
表 user_orders
含 user_id
、order_no
、order_date
,需合并成 订单号(日期)
格式:
SELECT user_id,
GROUP_CONCAT(
CONCAT(order_no, ' (', order_date, ')')
ORDER BY order_date DESC
SEPARATOR '; '
) AS order_info
FROM user_orders
GROUP BY user_id;
作用:按下单时间倒序,用 ;
分隔,清晰展示用户历史订单。
2. 处理 NULL
值(用 COALESCE
替换)
表 tasks
含 task_id
、user_id
、task_note
(可能为 NULL
),需合并且替换 NULL
为 [无备注]
:
SELECT user_id,
GROUP_CONCAT(
COALESCE(task_note, '[无备注]')
SEPARATOR ' | '
) AS all_notes
FROM tasks
GROUP BY user_id;
作用:避免 NULL
导致拼接后缺失内容,统一替换让结果更规整。
六、注意事项
1. 长度限制(group_concat_max_len
)
- MySQL 默认限制拼接结果长度(默认 1024 字节 ,可通过
SHOW VARIABLES LIKE 'group_concat_max_len';
查看)。 - 若拼接内容超长,结果会被 截断 !解决方法:
-- 临时生效(当前会话)
SET SESSION group_concat_max_len = 102400;
-- 永久生效(需修改配置文件,重启服务)
# 在 my.cnf 或 my.ini 中添加
group_concat_max_len = 102400
2. 性能影响
- 处理 超大量数据 时,拼接操作会消耗较多内存和 CPU,可能拖慢查询。
- 优化建议:
- 尽量缩小查询范围(用
WHERE
过滤不必要数据); - 避免嵌套复杂表达式,简化拼接逻辑;
- 确认是否真的需要合并所有数据,而非分开展示。
3. 与其他数据库差异
- Oracle 用
LISTAGG
,SQL Server 用STRING_AGG
,语法和细节不同,迁移需注意适配。