SQL分組中WHERE和HAVING的異同
當我們使用SQL進行分組時,可以使用GROUP BY來實現:
程式意圖很明顯:按產品彙總銷售額。
當我們需要對分組進行限制時,如剔除掉產品為null的組,可以通過兩種方式來實現:
mysql中的執行時間對比:
可以看到使用WHERE時效率更高。
兩種方式差異總結如下:
[list]
[*]語法上:WHERE在GROU BY之前,HAVING在之後
[*]執行計劃:WHERE使得限制發生在分組之前,HAVING是在分組之後
[*]效率上:使用WHERE使得目標結果集更小,分組彙總的效率高;使用HAVING時,結果集不變,WHERE效率更高
[*]其他:WHERE可以使用表中的任意欄位進行限制,而HAVING必須是SELECT後面的欄位
[/list]
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]
相關文章
- SQL中 where 子句和having子句中的區別SQL
- having和where
- MySQL之Where和Having的區別MySql
- mysql的having和where有什麼區別MySql
- 資料庫中where與having的區別資料庫
- SQL中where和on的區別SQL
- Swift中Class和Struct異同SwiftStruct
- 聚合函式及分組與過濾(GROUP BY … HAVING)函式
- 5分鐘掌握var,let和const異同
- Java 中 this 和 super 的用法概述及異同Java
- ClickHouse原始碼筆記4:FilterBlockInputStream, 探尋where,having的實現原始碼筆記FilterBloC
- Android中gradle檔案中implementation和compile的異同AndroidGradleCompile
- MyBatis中的<where>標籤和where子句的區別MyBatis
- dependencies 和 devDependencies 的異同dev
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- 分組異或
- Mysql系列第九講 分組查詢詳解(group by & having)MySql
- HashData和Snowflake的“同”與“異”
- SQL JOIN 中 on 與 where 有何區別SQL
- RestController和Controller的區別和異同RESTController
- python 元組與列表的異同點 1125Python
- 神奇的 SQL 之 HAVING → 容易被輕視的主角SQL
- powershell中的where和foreach比較
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- Petapoco、Dapper和EF Core的異同APP
- Web前端和後端的異同Web前端後端
- SQL 如何計算每個分組的中位數SQL
- sql中的left切割 與 group by後的兩次分組SQL
- SQL-分組聚合 - 單欄位分組SQL
- workman 和swoole 區別 和異同
- Mysql 分組排序的sql寫法MySql排序
- 77. C#中的介面和類有什麼異同?C#
- 異常-異常的概述和分類
- 策略模式和模板方法模式的異同模式
- 前端和後端開發的異同前端後端
- Java中異常分類和Throw和Throws的區別Java
- python經典面試題:列表和元組有什麼異同?Python面試題
- JavaScript中var與let的異同點JavaScript
- PHP TP框架同時使用where whereOrPHP框架