listagg、xmlagg、group_concat()函数用法

三种聚合函数

listagg函数

listagg 是oracle数据库中的函数,可以使用指定连接符将字符串连接。

如有表 AREAS:

sql 复制代码
CREATE TABLE AREAS
(
	AREA_CODE VARCHAR(32) NULL COMMENT '地区编码',
	AREA_NAME VARCHAR(32) NULL COMMENT '地区名称',
	AREA_PID VARCHAR(32) NULL COMMENT '父级地区编码'
);

将符合某条件的全部数据中的地区名称罗列出来,并以"|"分隔开

数据库语句为

sql 复制代码
SELECT LISTAGG(AREA_NAME, '|') WITHIN GROUP (ORDER BY AREA_CODE) AS NAME_LIST FROM AREAS;

返回结果:

北京市|长沙市|长沙县|万科城市花园|重庆市|房聚首府小区|芙蓉区|衡阳市|黄冈市|黄石市|湖北省|湖南省|荆门市|君山区|君山壹号|开福区|浏阳市|宁乡市|上海市|天津市|天心区|望城区......

这种方式的缺点是长度有限。返回值为VARCHAR2类型,最大字节长度为4000,超过这个长度会报错。

XMLAGG函数

同样的表,同样的条件,使用XMLAGG函数:

sql 复制代码
SELECT TRIM(BOTH
            FROM
            XMLAGG(
                    XMLELEMENT(
                            E,
                            AREA_NAME || ',') ORDER BY AREA_CODE).EXTRACT('//text()')
           AS NAME_LIST
            FROM AREAS;

或者换一种写法:

sql 复制代码
SELECT XMLAGG(
    XMLPARSE(
        CONTENT AREA_NAME || '|' WELLFORMED
        ) ORDER BY AREA_CODE).GETCLOBVAL()
FROM AREAS;

XMLAGG函数在长度限制方面要更宽松,返回的类型为CLOB,最大字节长度为32767。

GROUP_CONCAT()函数

上述两种均是oracle中的函数。

GROUP_CONCAT()是mysql中的函数。

同样的表和查询,在mysql数据库中,使用group_concat()函数:

sql 复制代码
SELECT GROUP_CONCAT(AREA_NAME ORDER BY AREA_CODE ASC SEPARATOR '|') AS NAME_LIST FROM AREAS;

GROUP_CONCAT()函数的长度限制为1024字节。

不过可以通过数据库配置来修改这个长度,最大可以设置为102400。

可以通过修改my.ini配置文件方式进行设置

group_concat_max_len = 102400

也可以通过命令设置

sql 复制代码
SET GLOBAL group_concat_max_len = 102400;
SET SESSION group_concat_max_len = 102400;

需要注意的是,设置后,需要重启 mysql 服务。

相关推荐
znnnk37 分钟前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle
微微%1 小时前
mysql的安装和使用
数据库·mysql·mysql8安装
十年程序梦5 小时前
2026最新国内省市区县表,mysql表格
mysql
Random Glow7 小时前
二级索引与回表:一次回表到底多贵
数据库·mysql·性能优化·innodb·索引
sunburn-8 小时前
数据库聚合查询完整教程:从基础函数到实战统计
java·数据库·mysql·数据库开发
gerrywhu9 小时前
PostGIS 中的窗口函数与聚合函数:原理、区别及实战应用
postgis·窗口函数·聚合函数
❀͜͡傀儡师10 小时前
MySQL REST Service 认证鉴权体系与 MySQL 26.10.0 内置化演进
数据库·mysql·adb
数据库小学妹10 小时前
MySQL binlog格式怎么选?ROW、STATEMENT、MIXED的区别与坑
数据库·mysql·binlog·主从复制·数据一致性
花间相见10 小时前
【计算基础|MySQL18】Buffer Pool 与内存管理
后端·sql·mysql
杨云龙UP11 小时前
生产实战:Keepalived + Nginx + MySQL 双向复制高可用架构部署与原理详解
运维·数据库·mysql·nginx·架构·keepalived·高可用架构