[轉載] 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