1. 程式人生 > 實用技巧 >[轉載] SQL Server 中where 與 having 的區別(涉及到 group by 以及聚合函式 )

[轉載] SQL Server 中where 與 having 的區別(涉及到 group by 以及聚合函式 )

SQL 中 where 和 having 的區別

[轉載]

原文: https://www.jianshu.com/p/fbf5d6376f9d

“Where” 是一個約束宣告,使用Where來約束來之資料庫的資料,Where是在結果返回之前起作用的,且Where中不能使用聚合函式
“Having”是一個過濾宣告,是在查詢返回結果集以後對查詢結果進行的過濾操作在Having中可以使用聚合函式

在說區別之前,得先介紹GROUP BY這個子句,而在說GROUP子句前,又得先說說“聚合函式”——SQL語言中一種特殊的函式。例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。
如:

SELECT SUM(population) FROM vv_t_bbc ;

這裡的SUM作用在所有返回記錄的population欄位上,結果就是該查詢只返回一個結果,即所有國家的總人口數。

而通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函式對屬於一組的資料起作用。

注意兩點:

  • 當你指定 GROUP BY region 時,只有屬於同一個region(地區)的一組資料才將返回一行值

  • 表中所有除region(地區)外的欄位,只能通過 SUM, COUNT等聚合函式運算後返回一個值。

下面說說having和where的區別
having子句可以讓我們篩選成組後的各組資料,where子句在聚合前先篩選記錄。也就是說where是作用在group by子句和having子句之前,而having子句是在聚合後對組記錄進行篩選。
例子:
一:顯示每個地區的總人口數和總面積:

select region,sum(population),sum(area) 
from bbc 
group by region

二:顯示每個地區的總人口數和總面積,僅顯示那些人口數量超過1000000的地區:

select region,sum(population),sum(area) 
from bbc 
group by region
having sum(population) > 1000000

注意:
1:在這裡,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。相反,having子句可以讓我麼篩選成組後的各組資料。
2:如果想根據sum後的欄位進行排序,可以在後面加上:order by sum(population) desc/asc