基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
分组查询
更新时间:2023-07-18 17:25:58
GROUP BY 子句用于对查询结果进行分组。
分组查询语法
GROUP BY 支持单字段分组和多字段分组,使用 WHERE 子句可以在分组前对数据进行筛选,使用 HAVING 子句可以在分组后对数据进行筛选,使用 ORDER BY 子句可以在分组后对数据进行排序。分组查询的 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 分组,查询每个部门的人数,示例如下:
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 分组,查询每个部门不同角色的人数,示例如下:
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 的部门人数,示例如下:
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 和下单数量。
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 分组,查询按总工资降序排序的部门人数,示例如下:
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