GROUP BY子句
GROUP BY 子句允许您查找行组而不是单个行的特征。
指定 GROUP BY 子句时, SQL 会将所选行划分为组,使每个组的行在一个或多个列或表达式中具有匹配的值。 接下来, SQL 将处理每个组以生成该组的单行结果。 可以在 GROUP BY 子句中指定一个或多个列或表达式以对行进行分组。 在 SELECT 语句中指定的项是每组行的属性,而不是表或视图中各个行的属性。
如果不使用 GROUP BY 子句,那么 SQL 聚集函数的应用程序将返回 一行 。 当使用 GROUP BY 时,该函数将应用于 每个 组,从而返回与组一样多的行。
例如, CORPDATA.EMPLOYEE 表有几组行,每组由描述特定部门成员的行组成。 要查找每个部门人员的平均工资,可以发放:
SELECT WORKDEPT, DECIMAL (AVG(SALARY),5,0)
FROM CORPDATA.EMPLOYEE
GROUP BY WORKDEPT;结果是多行,每个部门一行。
| WORKDEPT | 平均工资 |
|---|---|
| A00 | 40850 |
| B01 | 41250 |
| C01 | 29722 |
| D11 | 25147 |
| D21 | 25668 |
| E01 | 40175 |
| E11 | 21020 |
| E21 | 24086 |
注:
- 对行进行分组并不意味着对行进行排序。 分组将每个选定行放入一个组中,然后 SQL 将处理该组的特征。 对行进行排序会将结果表中的所有行按升序或降序整理顺序放置。 根据数据库管理器选择的实现,可能会对生成的组进行排序。
- 如果在 GROUP BY 子句中指定的列中存在空值,那么将为具有空值的行中的数据生成单行结果。
- 如果分组发生在字符或 UCS-2 或 UTF-16 图形列上,那么运行查询时生效的排序顺序将应用于分组。
使用 GROUP BY 时,将列出您希望 SQL 用于对行进行分组的列或表达式。 例如,假设您需要在 CORPDATA.PROJECT 表。 您可以发出:
SELECT SUM(PRSTAFF), MAJPROJ
FROM CORPDATA.PROJECT
GROUP BY MAJPROJ;结果是公司目前的重大项目和每个项目工作人数的列表。
| SUM (PRSTAFF) | MAJPROJ |
|---|---|
| 6 | AD3100 |
| 5 | AD3110 |
| 10 | MA2100 |
| 8 | MA2110 |
| 5 | OP1000 |
| 4 | OP2000 |
| 3 | OP2010 |
| 32.5 | ? |
您还可以指定要按多个列或表达式对行进行分组。 例如,您可以使用 CORPDATA.EMPLOYEE 表。 为此,您可以发出:
SELECT WORKDEPT, SEX, DECIMAL(AVG(SALARY),5,0) AS AVG_WAGES
FROM CORPDATA.EMPLOYEE
GROUP BY WORKDEPT, SEX;结果如下。
| WORKDEPT | SEX | 平均工资 |
|---|---|---|
| A00 | F | 49625 |
| A00 | M | 35000 |
| B01 | M | 41250 |
| C01 | F | 29722 |
| D11 | F | 25817 |
| D11 | M | 24764 |
| D21 | F | 26933 |
| D21 | M | 24720 |
| E01 | M | 40175 |
| E11 | F | 22810 |
| E11 | M | 16545 |
| E21 | F | 25370 |
| E21 | M | 23830 |
由于未在此示例中包含 WHERE 子句,因此 SQL 将检查并处理 CORPDATA.EMPLOYEE 表。 在 SQL 派生每个组的平均 SALARY 值之前,首先按部门编号对行进行分组,然后按性别对行进行分组 (在每个部门内)。