在SQL数据库的实际开发场景中,经常需要将同一分组下的多行文本内容合并成一行展示,比如统计每个用户的多个订单备注、汇总每个部门的员工姓名等。创建SQL视图时,这类需求同样频繁出现,MySQL提供的GROUP_CONCAT函数就是实现多行文本合并的核心工具,能够直接在查询阶段完成数据拼接,无需后续额外处理。

GROUP_CONCAT函数基本语法
GROUP_CONCAT函数的作用是将分组后的多行数据按照指定规则拼接成单个字符串,基础语法如下:
GROUP_CONCAT([DISTINCT] 要合并的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])
其中各个参数的含义如下:
- DISTINCT:可选参数,用于去除合并结果中的重复值
- 要合并的字段:必填参数,指定需要合并的目标字段
- ORDER BY:可选参数,指定合并前字段的排序规则
- SEPARATOR:可选参数,指定合并后各值之间的分隔符,默认分隔符为英文逗号
SQL视图中合并多行文本的实现步骤
假设我们有两个业务表,一个是用户表user_info,一个是用户的订单表order_info,表结构如下:
-- 用户表
CREATE TABLE user_info (
user_id INT PRIMARY KEY,
user_name VARCHAR(50)
);
-- 订单表
CREATE TABLE order_info (
order_id INT PRIMARY KEY,
user_id INT,
order_remark VARCHAR(200)
);
现在需要创建一个SQL视图,展示每个用户的所有订单备注合并后的结果,具体实现步骤如下:
步骤1:编写基础合并查询
先编写普通的查询语句,验证GROUP_CONCAT的合并效果:
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(o.order_remark) AS all_remarks
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
GROUP BY u.user_id, u.user_name;
步骤2:将查询封装为SQL视图
确认查询结果符合预期后,将上述查询语句封装为SQL视图:
CREATE VIEW user_order_remark_view AS
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(o.order_remark) AS all_remarks
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
GROUP BY u.user_id, u.user_name;
创建完成后,直接查询该视图就能得到每个用户合并后的订单备注:
SELECT * FROM user_order_remark_view;
常见使用场景与优化
自定义分隔符
如果默认的英文逗号分隔符不符合需求,可以通过SEPARATOR参数自定义,比如使用竖线分隔:
CREATE VIEW user_order_remark_view AS
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(o.order_remark SEPARATOR '|') AS all_remarks
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
GROUP BY u.user_id, u.user_name;
去重合并
如果合并的字段存在重复值,需要去重后再合并,可以添加DISTINCT关键字:
CREATE VIEW user_order_remark_view AS
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(DISTINCT o.order_remark) AS all_remarks
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
GROUP BY u.user_id, u.user_name;
排序后合并
如果需要按照指定顺序合并字段值,可以添加ORDER BY子句:
CREATE VIEW user_order_remark_view AS
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(o.order_remark ORDER BY o.order_id ASC) AS all_remarks
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
GROUP BY u.user_id, u.user_name;
注意事项
使用GROUP_CONCAT函数时需要注意默认的长度限制,MySQL中GROUP_CONCAT的结果默认最大长度为1024字节,超过该长度的内容会被截断。如果需要调整长度限制,可以修改系统变量group_concat_max_len:
-- 临时修改当前会话的长度限制为10240字节 SET SESSION group_concat_max_len = 10240; -- 全局修改长度限制,需要管理员权限 SET GLOBAL group_concat_max_len = 10240;
另外,如果合并的字段值为NULL,GROUP_CONCAT会忽略该值,不会将其纳入合并结果中。如果需要处理NULL值,可以结合IFNULL函数使用,比如将NULL值替换为空字符串:
GROUP_CONCAT(IFNULL(o.order_remark, '')) AS all_remarks
SQL视图GROUP_CONCAT多行文本合并数据库查询修改时间:2026-07-11 19:42:31