在SQL的实际开发工作中,经常会遇到需要将同一分组下的多行数据合并成单个字符串的场景,比如统计每个部门的员工姓名、汇总每个用户的订单编号等。GROUP_CONCAT函数是MySQL等数据库提供的专门用于解决这类问题的聚合函数,能够在分组查询时快速完成多行到单行的字符串拼接。

GROUP_CONCAT函数基本语法
GROUP_CONCAT函数的基础语法格式如下:
GROUP_CONCAT([DISTINCT] 列名 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])
其中各个参数的含义如下:
- DISTINCT:可选参数,用于去重,只拼接分组内不重复的值
- 列名:必填参数,指定需要拼接的字段
- ORDER BY:可选参数,指定拼接时的排序规则,可以按照指定字段升序或降序排列
- SEPARATOR:可选参数,指定拼接时的分隔符,默认分隔符是英文逗号
基础使用示例
假设我们有如下的员工表employee,表结构如下:
| id | dept_id | emp_name |
|---|---|---|
| 1 | 1 | 张三 |
| 2 | 1 | 李四 |
| 3 | 2 | 王五 |
| 4 | 1 | 赵六 |
| 5 | 2 | 钱七 |
现在需要查询每个部门的员工姓名,将同一部门的员工姓名合并成字符串,基础查询语句如下:
SELECT dept_id, GROUP_CONCAT(emp_name) AS emp_names FROM employee GROUP BY dept_id;
执行上述语句后,得到的结果如下:
| dept_id | emp_names |
|---|---|
| 1 | 张三,李四,赵六 |
| 2 | 王五,钱七 |
常用参数配置示例
自定义分隔符
如果需要使用除逗号以外的分隔符,比如用竖线分割,可以通过SEPARATOR参数指定:
SELECT dept_id, GROUP_CONCAT(emp_name SEPARATOR '|') AS emp_names FROM employee GROUP BY dept_id;
执行后部门1的结果会变为张三|李四|赵六。
拼接时排序
如果需要按照员工姓名的长度或者id顺序拼接,可以添加ORDER BY子句:
SELECT dept_id, GROUP_CONCAT(emp_name ORDER BY id ASC) AS emp_names FROM employee GROUP BY dept_id;
这样部门1的员工会按照id升序拼接为张三,李四,赵六。
去重拼接
如果分组内有重复的字段值,需要去重后再拼接,可以添加DISTINCT关键字:
-- 假设员工表有重复的姓名,去重后拼接 SELECT dept_id, GROUP_CONCAT(DISTINCT emp_name) AS emp_names FROM employee GROUP BY dept_id;
使用注意事项
GROUP_CONCAT函数拼接的字符串有默认长度限制,默认是1024字符,如果拼接的内容超过这个长度,多余的部分会被截断。如果需要调整长度限制,可以通过修改group_concat_max_len系统变量实现:
-- 设置拼接最大长度为10000字符,当前会话生效 SET SESSION group_concat_max_len = 10000; -- 全局生效需要添加GLOBAL关键字 SET GLOBAL group_concat_max_len = 10000;
另外,GROUP_CONCAT函数只能用于支持该语法的数据库,比如MySQL、MariaDB,如果是其他数据库比如PostgreSQL、SQL Server,需要使用对应的替代函数,比如PostgreSQL的STRING_AGG函数,SQL Server的STRING_AGG函数(2017及以上版本支持)。
实际业务场景示例
假设有订单表order_info,结构如下:
| order_id | user_id | product_name |
|---|---|---|
| 1001 | 1 | 手机 |
| 1002 | 1 | 耳机 |
| 1003 | 2 | 平板 |
| 1004 | 1 | 充电器 |
现在需要查询每个用户购买的所有商品名称,用顿号分割,并且按照订单id升序排列,语句如下:
SELECT user_id, GROUP_CONCAT(product_name ORDER BY order_id ASC SEPARATOR '、') AS product_list FROM order_info GROUP BY user_id;
执行后用户1的结果会显示为手机、耳机、充电器,满足业务展示需求。
SQLGROUP_CONCAT多行合并分组查询修改时间:2026-07-01 19:27:23