HAVING 子句

使用 HAVING 子句来将一个或多个限定的条件应用到组或应用到整个结果集。

HAVING 子句

在下列示例中,每一条件将该组的一个计算的属性与该组的另一计算的属性或常量进行比较。第一个 SELECT 语句使用 HAVING 子句,将计算的表达式 COUNT(*) 与常量 2 进行比较。该查询返回有两个以上项的所有订单上每项的平均合计价格。

第二个 SELECT 语句罗列那些在同一个月中呼叫两次或更多次的客户的客户及其呼叫月份:
SELECT order_num, AVG(total_price) FROM items
          GROUP BY order_num HAVING COUNT(*) > 2; 
          SELECT customer_num, EXTEND (call_dtime, MONTH TO MONTH) 
          FROM cust_calls GROUP BY 1, 2 HAVING COUNT(*) > 1;
您可使用 HAVING 子句来在 GROUP BY 列值上以及在计算的值上设置条件。 此示例返回 cust_code customer_numcall_dtime,并从 customer_num 小于 120 的客户已收到的所有呼叫的 call_code 来将它们分组:
SELECT customer_num, EXTEND (call_dtime), call_code 
          FROM cust_calls GROUP BY call_code, 2, 1
          HAVING customer_num < 120;
HAVING 子句通常是对 GROUP BY 子句的补充。 如果您省略 GROUP BY 子句,则 HAVING 子句应用于满足该查询的所有行,以及在组成单个组的表中的所有行。下列示例返回该表中所有值的平均价格,只要表中有十行以上:
SELECT AVG(total_price) FROM items HAVING COUNT(*) > 10;

由于在 WHERE 子句中的条件不可包括聚集表达式,所以您可使用 HAVING 子句来将带有聚集的条件应用于查询的整个结果集,如上例所示。

在 HAVING 子句中的条件不可包括 DISTINCT 或 UNIQUE 聚集表达式。例如,下列查询失败并报语法错误:
 SELECT order_num, COUNT(*) number, AVG (total_price) average
          FROM items
          GROUP BY order_num
          HAVING COUNT(DISTINCT *) > 2;

然而,如果从上述示例省略 DISTINCT 关键字,则不发出错误。

1 请参阅 条件