---
title: "分组查询 | OceanBase 文档中心"
description: 分组查询 GROUP BY 子句用于对查询结果进行分组。 分组查询语法 GROUP BY 支持单字段分组和多字段分组，使用 WHERE 子句可以在分组前对数据进行筛选，使用 HAVING 子句可以在分组后对数据进行筛选，使用 ORDER BY 子句可以在分组后对数据进行排序。分组查询的 SQL 语句格式如下： SEL…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 分组查询

更新时间：2023-07-18 17:25:58

GROUP BY 子句用于对查询结果进行分组。

## 分组查询语法

`GROUP BY` 支持单字段分组和多字段分组，使用 `WHERE` 子句可以在分组前对数据进行筛选，使用 `HAVING` 子句可以在分组后对数据进行筛选，使用 `ORDER BY` 子句可以在分组后对数据进行排序。分组查询的 SQL 语句格式如下：

```sql
SELECT select_list FROM table_list
  [WHERE query_condition]
  GROUP BY group_by_expression
  [HAVING group_condition];

select_list：
  column_name, group_function,...

```

语法的参数说明如下：

- `group_function` 表示聚合函数。
 - `group_by_expression` 表示分组表达式，多个表达式之间用逗号隔开。
 - `group_condition` 表示分组之后对数据进行过滤。

分组中常用的聚合函数如下表所示。

| 聚合函数 | 作用 |
| --- | --- |
| MAX() | 查询指定列的最大值。 |
| MIN() | 查询指定列的最小值。 |
| COUNT() | 统计查询结果的行数。 |
| SUM() | 返回指定列的总和。 |
| AVG() | 返回指定列数据的平均值。 |

## 分组查询示例

### 单字段分组查询

按 `deptno` 分组，查询每个部门的人数，示例如下：

```sql
obclient> SELECT deptno, COUNT(empno) FROM emp GROUP BY deptno;
+--------+--------------+
| deptno | COUNT(empno) |
+--------+--------------+
|     20 |            2 |
|     30 |            2 |
|     40 |            2 |
+--------+--------------+
3 rows in set

```

### 多字段分组查询

按 deptno 和 job 分组，查询每个部门不同角色的人数，示例如下：

```sql
obclient> SELECT deptno, job, COUNT(empno) FROM emp GROUP BY deptno, job;
+--------+----------+--------------+
| deptno | job      | COUNT(empno) |
+--------+----------+--------------+
|     20 | ANALYST  |            1 |
|     20 | CLERK    |            1 |
|     30 | MANAGER  |            1 |
|     30 | SALESMAN |            1 |
|     40 | ANALYST  |            1 |
|     40 | MANAGER  |            1 |
+--------+----------+--------------+
6 rows in set

```

### 分组前筛选

按 `deptno` 分组，查询部门编号大于 20 的部门人数，示例如下：

```sql
obclient> SELECT deptno, COUNT(empno) FROM emp WHERE deptno > 20 GROUP BY deptno;
+--------+--------------+
| deptno | COUNT(empno) |
+--------+--------------+
|     30 |            2 |
|     40 |            2 |
+--------+--------------+
2 rows in set

```

### 分组后筛选

查询 2019 年订单数量大于等于 2 的客户，并输出客户 ID 和下单数量。

```sql
obclient> SELECT user_id 客户ID, COUNT(order_id) 下单数量 FROM fruit_order t WHERE t.order_year = 2019 GROUP BY user_id HAVING COUNT(order_id)>=2;
+----------+--------------+
| 客户ID   | 下单数量     |
+----------+--------------+
|     1022 |            2 |
+----------+--------------+
1 row in set

```

> **说明**
>
>  
>
> 当查询中包含 `HAVING` 时，先获得不含 `HAVING` 子句时的 SQL 查询结果，然后在这个结果的基础上使用 `HAVING` 条件筛选出符合的数据，最后返回这些数据。由此，`HAVING` 后是可以使用聚合函数，并且这个聚集函数不必与 `SELECT` 后面的聚集函数相同。

### 分组后排序

按 deptno 分组，查询按总工资降序排序的部门人数，示例如下：

```sql
obclient> SELECT deptno, COUNT(empno), SUM(sal) FROM emp GROUP BY deptno ORDER BY SUM(sal) DESC;
+--------+--------------+----------+
| deptno | COUNT(empno) | SUM(sal) |
+--------+--------------+----------+
|     40 |            2 |  5975.00 |
|     30 |            2 |  4450.00 |
|     20 |            2 |  3800.00 |
+--------+--------------+----------+
3 rows in set

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
