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

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;

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值