一、基本概念
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 = 1024002. 性能影响
- 处理 超大量数据 时,拼接操作会消耗较多内存和 CPU,可能拖慢查询。
- 优化建议:
- 尽量缩小查询范围(用
WHERE过滤不必要数据); - 避免嵌套复杂表达式,简化拼接逻辑;
- 确认是否真的需要合并所有数据,而非分开展示。
3. 与其他数据库差异
- Oracle 用
LISTAGG,SQL Server 用STRING_AGG,语法和细节不同,迁移需注意适配。









