【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行

四大数据库多行合并为单行:函数详解与对比

一、MySQL

GROUP_CONCAT() 函数说明:
  • 将分组后的多行数据按指定分隔符合并为单行字符串,支持去重、排序和自定义分隔符。
语法结构:
sql 复制代码
GROUP_CONCAT(
  [DISTINCT] 列名 
  [ORDER BY 排序列 [ASC|DESC]] 
  [SEPARATOR '分隔符']
)
参数解释:
  • DISTINCT:可选,对结果去重
  • ORDER BY:可选,控制合并顺序
  • SEPARATOR:可选,默认逗号分隔
示例:
sql 复制代码
SELECT 
  username,
  GROUP_CONCAT(DISTINCT coursename ORDER BY coursename DESC SEPARATOR '|') AS courses
FROM t_user_course
GROUP BY username;
注意事项:
  • 默认最大长度由 group_concat_max_len 参数控制(默认1024字节)
  • 超长内容会被截断,可通过 SET group_concat_max_len=2048; 调整

二、Oracle

LISTAGG() 函数说明:
  • 将分组内数据按指定顺序和分隔符拼接为字符串,自动处理NULL值,常用于行转列场景。
语法结构:
sql 复制代码
LISTAGG(列名 [, '分隔符']) 
  WITHIN GROUP (ORDER BY 排序列 [ASC|DESC])
参数解释:
  • 分隔符:可选,默认无分隔符
  • WITHIN GROUP:必选,指定排序规则
示例:
sql 复制代码
SELECT 
  username,
  LISTAGG(coursename, ';') WITHIN GROUP (ORDER BY create_time) AS courses
FROM t_user_course
GROUP BY username;
注意事项:
  • 严格长度限制:返回结果不得超过 4000字符
  • 超长处理方案:
    CLOB类型:XMLAGG(XMLELEMENT(e, coursename, ',').EXTRACT('//text()')).GETCLOBVAL()

三、SQL Server

STRING_AGG() 函数说明:
  • 将分组结果拼接为字符串,需预先排序,支持分隔符自定义。
语法结构:
sql 复制代码
STRING_AGG(列名, '分隔符') [WITHIN GROUP (ORDER BY 排序列)]
参数解释:
  • 分隔符:必选参数
  • WITHIN GROUP:可选,2017版本后支持排序
示例:
sql 复制代码
SELECT 
  username,
  STRING_AGG(coursename, ',') WITHIN GROUP (ORDER BY score DESC) AS courses
FROM t_user_course
GROUP BY username;
旧版本替代方案:
sql 复制代码
SELECT 
  username,
  courses = STUFF((
    SELECT ',' + coursename 
    FROM t_user_course 
    WHERE username = a.username 
    FOR XML PATH('')
  ), 1, 1, '')
FROM t_user_course a
GROUP BY username;

四、PostgreSQL

STRING_AGG() 函数说明:
  • 聚合函数中灵活性最高,支持大文本(1GB限制),可配合FILTER子句使用。
语法结构:
sql 复制代码
STRING_AGG(列名, '分隔符' [ORDER BY 排序列])
参数解释:
  • 分隔符:必选参数
  • ORDER BY:直接内联排序控制
示例:
sql 复制代码
SELECT 
  username,
  STRING_AGG(coursename, '|' ORDER BY course_id) AS courses
FROM t_user_course
GROUP BY username;
特殊用法:
sql 复制代码
-- 配合DISTINCT使用
STRING_AGG(DISTINCT coursename, ',')
-- 配合FILTER子句
STRING_AGG(coursename, ',' ORDER BY ...) FILTER (WHERE score > 60)

对比总结表格

功能特性 MySQL Oracle SQL Server PostgreSQL
基础函数 GROUP_CONCAT() LISTAGG() STRING_AGG() STRING_AGG()
排序控制 ORDER BY子句内 WITHIN GROUP内 WITHIN GROUP子句 直接内联ORDER BY
去重支持 支持DISTINCT 需配合子查询 需配合子查询 支持DISTINCT
空值处理 自动跳过NULL 自动跳过NULL 自动跳过NULL 保留NULL占位
长度限制 受参数控制 4000字符硬限制 无明确限制 1GB大对象支持
分隔符默认值 逗号 无(必须显式指定) 无(必须显式指定) 无(必须显式指定)
复制代码
可根据实际场景选择最合适的实现方案,建议优先使用各数据库的官方推荐聚合函数。
相关推荐
C137的本贾尼2 分钟前
磁盘结构与关键日志:Redo Log、Undo Log 与双写缓冲区
服务器·数据库·oracle
AOwhisky24 分钟前
MySQL 学习笔记(第五期):用户管理与权限控制
linux·运维·数据库·笔记·学习·mysql
SPC的存折33 分钟前
MySQL完整学习手册(视频精华版)
学习·mysql·音视频
C137的本贾尼1 小时前
JDBC 编程:用 Java 连接 MySQL
java·开发语言·mysql
六月雨滴1 小时前
Oracle PGA 优化
oracle·dba
IT邦德1 小时前
Oracle 26ai RAC 通过gold image RU打补丁
数据库·oracle
C137的本贾尼1 小时前
MySQL 整体架构与存储引擎对比
数据库·mysql·架构
j_xxx404_2 小时前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai
C137的本贾尼2 小时前
【实战】实现一个带事务与索引的命令行图书借阅系统
数据库·microsoft·oracle
_1_712 小时前
SQL Server 磁盘满了 收缩日志
数据库·sqlserver