原文地址
PostgreSQL 19 即将引入的新功能:GROUP BY ALL。以下是内容总结:
一、功能背景
- 提交时间:2025年9月29日,由 Tom Lane 提交。
- 功能说明 :
GROUP BY ALL是一种简化写法,自动将所有未包含聚合函数或窗口函数 的查询列添加到GROUP BY子句中。 - 标准化:该语法已被 SQL 标准委员会接受,并已在其他数据库系统中存在。
二、使用示例
1. 基本用法:
sql
-- 使用 GROUP BY ALL
SELECT relnamespace, relkind, COUNT(*)
FROM pg_class
GROUP BY ALL;
-- 等同于传统写法
SELECT relnamespace, relkind, COUNT(*)
FROM pg_class
GROUP BY relnamespace, relkind;
输出示例:
relnamespace │ relkind │ count
──────────────┼─────────┼───────
99 │ t │ 48
13331 │ v │ 65
... │ ... │ ...
2. 复杂查询示例(含连接和聚合):
sql
SELECT
n.nspname,
c.relkind,
COUNT(*) FILTER (WHERE c.relname ~ 'a'),
ARRAY_AGG(DISTINCT relowner::regrole::text)
FROM
pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
GROUP BY ALL
ORDER BY n.nspname, c.relkind;
输出示例:
nspname | relkind | count | array_agg
--------------------+---------+-------+----------------
information_schema | r | 3 | {pgdba}
pg_catalog | i | 98 | {pgdba}
... | ... | ... | ...
三、功能特点
- 自动推断分组列 :自动将 SELECT 中所有非聚合、非窗口函数的列添加到 GROUP BY 列表。
- 排除聚合与窗口函数 :如
COUNT()、ARRAY_AGG()等不会被加入分组条件。 - 兼容复杂表达式:支持连接查询、条件过滤等复杂场景。
- 简化语法:减少重复编写列名,适用于快速数据探索。
四、总结
GROUP BY ALL 是 PostgreSQL 19 中一个实用的语法扩展,尤其适合快速数据探查和简化查询编写。虽然传统显式写法更明确,但新语法在保持逻辑清晰的同时减少了代码冗余,体现了 PostgreSQL 对现代 SQL 标准的持续跟进。
如果需要进一步了解该功能的具体限制或与其他数据库的兼容性,可参考原文中的讨论链接。