对group by的结果集进行分组过滤 where 与 having 用法的区别

时间:2023-02-08 20:10:10

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;