第10课 分组数据
这一课介绍如何分组数据,以便汇总表内容的子集。这涉及两个新SELECT子句:GROUP BY子句和HAVING子句。
数据分组
使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
创建分组
分组是使用SELECT语句的GROUP BY子句建立的。
SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;
GRUOP BY子句指示数据库系统按vend_id排序并分组数据。 GROUP BY子句指示数据库系统分组数据,然后对每个组而不是整个结果集进行聚集。意思是每个分组都单独进行COUNT()计算。
注意:GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
过滤分组,使用HAVING
HAVING子句类似WHERE。事实上,目前为止所学过的所有类别的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。
SELECT cust_id, COUNT() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >=2 ;
GROUP BY子句在HAVING之前。
HAVING和WHERE的差别:WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
SELECT vend_id, COUNT() AS num_prods FROM Products WHERE prod_price >=4 GROUP BY vend_id HAVING COUNT() >=2;
分组和排序
| ORDER BY | GROUP BY |
| 对产生的输出排序 | 对行分组,单输出可能不是分组的排序 |
| 任意列都可以使用(甚至非选择的列也可以) | 只可能使用选择列或表达式列,而且必须使用每个选择列的表达式 |
| 不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
SELECT order_num, COUNT() AS items FROM OrderItems GROUP BY order_num HAVING COUNT() >=3;
SELECT order_num, COUNT() AS items FROM OrderItems GROUP BY order_num HAVING COUNT() >= 3 ORDER BY items, order_num;
SELECT子句顺序
| 子句 | 说明 | 是否必须使用 |
| SELECT | 要返回的列或表达式 | 是 |
| FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
| WHERE | 行级过滤 | 否 |
| GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
| HAVING | 组级过滤 | 否 |
| ORDER BY | 输出排序顺序 | 否 |