# 聚合与分组

URL: https://caijiao.org/postgresql/basic/sql-query/group
Source: docs/postgresql/basic/sql-query/group.md
Description: 介绍 PostgreSQL 中的聚合函数与分组操作，讲解如何使用聚合函数计算统计数据，以及如何结合 'GROUP BY' 子句进行数据分组。

## 聚合函数

聚合函数用于对一组值执行计算，并返回单一的值。常用的聚合函数包括：`COUNT`、`SUM`、`AVG`、`MAX`、`MIN`。

### COUNT

`COUNT` 用于计算满足特定条件的记录数。

```sql
SELECT COUNT(*) FROM employees;
SELECT COUNT(DISTINCT department_id) FROM employees;
````

### SUM

`SUM` 用于计算某列数值的总和。

```sql
SELECT department, SUM(salary) FROM employees GROUP BY department;
```

### AVG

`AVG` 用于计算某列数值的平均值。

```sql
SELECT department, AVG(salary) FROM employees GROUP BY department;
```

### MAX / MIN

`MAX` 和 `MIN` 用于计算某列的最大值和最小值。

```sql
SELECT department, MAX(salary) FROM employees GROUP BY department;
SELECT department, MIN(salary) FROM employees GROUP BY department;
```

## GROUP BY 子句

`GROUP BY` 用于根据一个或多个列对结果集进行分组。通常与聚合函数一起使用。

### 按单列分组

```sql
SELECT department, AVG(salary) FROM employees GROUP BY department;
```

### 按多列分组

```sql
SELECT department, hired_at, COUNT(*) FROM employees GROUP BY department, hired_at;
```

### HAVING 子句

`HAVING` 用于过滤分组后的结果，通常与 `GROUP BY` 一起使用。与 `WHERE` 不同，`HAVING` 是在分组之后对结果进行过滤。

```sql
SELECT department, AVG(salary) FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
```

## 排序分组结果

可以使用 `ORDER BY` 对分组后的结果进行排序。

```sql
SELECT department, AVG(salary) FROM employees
GROUP BY department
ORDER BY AVG(salary) DESC;
```

## 小结

聚合与分组操作是 PostgreSQL 中强大的数据分析功能，帮助用户从大量数据中提取统计信息。通过 `GROUP BY` 和聚合函数的结合使用，可以实现各种类型的汇总、分组和统计分析。
