SQL分組中WHERE和HAVING的異同

dx871021發表於2016-07-12
當我們使用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時效率更高。

兩種方式差異總結如下:
[list]
[*]語法上:WHERE在GROU BY之前,HAVING在之後
[*]執行計劃:WHERE使得限制發生在分組之前,HAVING是在分組之後
[*]效率上:使用WHERE使得目標結果集更小,分組彙總的效率高;使用HAVING時,結果集不變,WHERE效率更高
[*]其他:WHERE可以使用表中的任意欄位進行限制,而HAVING必須是SELECT後面的欄位
[/list]

相關文章