`
dx871021
  • 浏览: 1669 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL分组中WHERE和HAVING的异同

    博客分类:
  • SQL
阅读更多
当我们使用SQL进行分组时,可以使用GROUP BY来实现:
select product_id,sum(amt)
from a_fin_factline
group by 1

程序意图很明显:按产品汇总销售额。

当我们需要对分组进行限制时,如剔除掉产品为null的组,可以通过两种方式来实现:
select product_id,sum(amt)
from a_fin_factline
group by 1
having product_id is not null;


select product_id,sum(amt)
from a_fin_factline
where product_id is not null
group by 1;


mysql中的执行时间对比:
select product_id,sum(amt)
from a_fin_factline
group by 1
having product_id is not null;
受影响的行: 0
时间: 1.086s

select product_id,sum(amt)
from a_fin_factline
where product_id is not null
group by 1;
受影响的行: 0
时间: 0.098s


可以看到使用WHERE时效率更高。

两种方式差异总结如下:
  • 语法上:WHERE在GROU BY之前,HAVING在之后
  • 执行计划:WHERE使得限制发生在分组之前,HAVING是在分组之后
  • 效率上:使用WHERE使得目标结果集更小,分组汇总的效率高;使用HAVING时,结果集不变,WHERE效率更高
  • 其他:WHERE可以使用表中的任意字段进行限制,而HAVING必须是SELECT后面的字段

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics