Postgresql UNION 语句

Postgresql GROUP BY 语句

在 Postgresql 中,GROUP BY 子句用于将查询结果按照一个或多个列进行分组,并对每个组应用聚合函数(如SUM, COUNT, AVG, MAX, MIN等)。GROUP BY 通常与 SELECT 语句一起使用,用于对数据进行汇总和分组统计。

基本语法


SELECT select_list
    FROM ...
    [WHERE ...]
    GROUP BY grouping_column_reference [, grouping_column_reference]...

GROUP BY 子句用于将表中列出的所有列中具有相同值的行分组在一起。列的列出顺序无关紧要。其效果是将具有公共值的每组行合并到一个组行中,该行表示组中的所有行。这样做是为了消除适用于这些组的输出和/或计算聚合中的冗余。


使用示例

假设有一个名为 users 的表,包含user_id, user_name, age, score列,可以如下使用 GROUP BY 子句:

1、按照 age 分组,统计各个年龄段的人数:

SELECT age, COUNT(user_id)
FROM users
GROUP BY age;


db_name=# SELECT age, COUNT(user_id)
db_name-# FROM users
db_name-# GROUP BY age;
 age | count
-----+-------
  22 |     2
  21 |     3
  24 |     2
  20 |     2
  23 |     1
(5 rows)


2、按照 age 分组,统计各个年龄段的积分总和

SELECT age, sum(score)
FROM users
GROUP BY age;
db_name=# SELECT age, sum(score)
db_name-# FROM users
db_name-# GROUP BY age;
 age | sum
-----+-----
  22 | 194
  21 | 287
  24 | 179
  20 | 172
  23 |  99


3、按照 age 分组,统计各个年龄段的积分平均值,并按平均值升序排列

SELECT age, AVG(score)
FROM users
GROUP BY age 
order by AVG(score) ASC;

db_name=# SELECT age, AVG(score)
db_name-# FROM users
db_name-# GROUP BY age
db_name-# order by AVG(score) ASC;
 age |         avg
-----+---------------------
  20 | 86.0000000000000000
  24 | 89.5000000000000000
  21 | 95.6666666666666667
  22 | 97.0000000000000000
  23 | 99.0000000000000000
(5 rows)



注意事项

  • 在GROUP BY子句中列出的每个列必须在SELECT列表中出现,或者是一个聚合函数的参数。

  • 聚合函数应用于每个分组后的结果集,而不是整个表。

  • 如果使用了GROUP BY,则除了聚合函数外的列,每个列的值必须在该组内是唯一的,否则MySQL会返回错误或不确定的结果。