可选 GROUP BY 和 HAVING 子句向 SELECT 语句添加功能。可以在基本 SELECT 语句中包括一个或全部两个子句来增大处理聚集的能力。
GROUP BY 子句组合类似的行,针对 Projection 子句中列出的每个列,为具有相同值的每组行生成单一结果行。HAVING 子句在构成组之后对那些组设置条件。可以不带 HAVING 子句使用 GROUP BY 子句或不带 GROUP BY 子句使用 HAVING 子句。
1.GROUP BY 子句
GROUP BY 子句将表分为几组。此子句通常与为每个这样的组生成总结值的聚集函数组合。编写 SELECT 语句中的某些示例显示了应用于整个表的聚集函数的用法。本章说明应用于行组的聚集函数。
使用不带聚集的 GROUP BY 子句与在 SELECT 子句中使用 DISTINCT(或 UNIQUE)关键字很相似。下列查询在选择特定列中描述。
SELECT DISTINCT customer_num FROM orders;
SELECT customer_num FROM orders GROUP BY customer_num;
结果
customer_num
101
104
106
110
⋮
124
126
127
GROUP BY 子句将行收集到组中,因此每一组中的每一行具有相同的客户号。在没有选择任何其它列的情况下,结束是唯一 customer_num 值的列表。
GROUP BY 子句的功能在将它与聚集函数配合使用时更明显。
下列查询检索每个订单的商品数和所有商品的总价。
SELECT order_num, COUNT (*) number, SUM (total_price) price FROM items GROUP BY order_num;
order_num number price
1001 1 $250.00
1002 2 $1200.00
1003 3 $959.00
1004 4 $1416.00
⋮
1021 4 $1614.00
1022 3 $232.00
1023 6 $824.00
GROUP BY 子句导致 items 表的行数被收集为组,每个组由具有相同 order_num 值的行组成(即,将每个订单的商品收集在一起)。在数据库服务器构成组之后,就在每个组中应用聚集行数 COUNT 和 SUM 。
对每一组返回每一行。它还使用标号来为 COUNT 和 SUM 表达式的结果提供名称,如下所示。该结果将 items 表的行收集到具有相同订单号的组中,并计算每个组中行的 COUNT 和价格的 SUM。
不能在 GROUP BY 子句中包含 TEXT 、BYTE 、CLOB 或 BLOB 列。要进行分组,必须能够进行排序,并且这些数据类型不存在自然排序顺序。
与 ORDER BY 子句不同,GROUP BY 子句不对数据进行排序。如果想要按特定顺序对数据进行排序,或在投影列表中的聚集上排序,那么在 GROUP BY 子句之后包含 ORDER BY 子句。