where过滤无法做到,因为where语句的执行在分组之前,因此过滤在分组之前。并且,where只能过滤行,不能过滤分组。(where中不能使用聚合函数)
having可以对group分组的结果集进行过滤,因其执行在分组之后,并其过滤可以基于分组聚集值。(having子句中可以直接使用聚合函数)
有这样的说法,“having子句中的列只能是group by子句中的列或者聚合函数的列”。实际上这也可以用上面所说的来解释--having在group by分组后才执行。
总结:
涉及到对分组结果集的过滤操作,都用having。
非分组结果集的操作,行级的操作,用where。
PS:“HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。” ----摘录来自: Ben Forta. “SQL必知必会(第4版)”。 iBooks.
但是自己在使用having时应该注意要结合group by 子句,而where子句用于标准的行级过滤。
例:你可能想要列出至少有两个订单的所有顾客。
SELECT cust_id, COUNT(*) AS orders FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;