1. 程式人生 > >聚合函式和Group by

聚合函式和Group by

聚合函式: sql語言中一種特殊的函式:聚合函式,SUM, COUNT, MAX, MIN, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。
SELECT SUM(population) FROM COUNTRY
這裡的SUM作用在所有返回記錄的population欄位上,結果就是該查詢只返回一個結果,即所有國家的總人口數
通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函式對屬於一組的資料起作用。當你指定 GROUP BY region 時, 屬於同一個region(地區)的一組資料將只能返回一行值,也就是說,表中所有除region(地區)外的欄位【被Group by指定的列可以返回多個值外】,只能通過 SUM, COUNT等
聚合函式
運算後
返回一個值
HAVING子句可以篩選成組後的各組資料,WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前。而 HAVING子句在聚合後對組記錄進行篩選。

二、例子:
一)顯示每個地區的總人口數和總面積: SELECT region, SUM(population), SUM(area)
FROM COUNTRY
GROUP BY region
regionPopulationare
上海108012000km
廣州212318000km

先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函式對每組中的不同欄位(一或多條記錄)作運算。


二) 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。
SELECT region, SUM(population), SUM(area)
FROM COUNTRY
GROUP BY region
HAVING SUM(area)>1000000
在這裡,不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。相反,HAVING子句可以篩選成組後的各組資料。

三) 查詢每個部門的每種職位的僱員數。
select deptno,job,count(*) from emp group by deptno,job。

三、
在select 語句中可以使用group by 子句將行劃分成較小的組,然後,使用聚組函式返回每一個組的彙總資訊,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,並返回行的彙總資訊Oracle 按照group by 子句中指定的表示式的值分組查詢結果。

在帶有group by 子句的查詢語句中,在select 列表中指定的列要麼是group by 子句中指定的列,要麼包含聚組函式
select max(sal),job emp group by job;
(注意max(sal),job的job並非一定要出現,但有意義)
查詢語句的select 和group by ,having 子句是聚組函式唯一出現的地方,在where 子句中不能使用聚組函式。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
當在gropu by 子句中使用having 子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用於設定限定條件where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,條件中不能包含聚組函式,使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之後過濾資料,條件中經常包含聚組函式,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。

表的設計:

表裡面的內容:

一:在不使用聚合函式的時候,group by 子句中必須包含所有的列,否則會報錯,如下

select name,MON from [測試、] group by name

會報錯:

在子句中加上所有的列的時候

select name,MON from [測試、] group by name,mon

這時候不報錯,執行結果

此時雖然成功執行了,但是可以看出來group by在這裡並沒有發揮任何的作用,我們完全可以直接select而不用group by,所以,group by子句要配合聚合函式使用,並且,在配合聚合函式使用的時候,在group by子句中不要加上聚合函式處的列名(加入as了的話)

配合聚合函式使用了的情況:

select SUM(mon),name from [測試、] group by name

結果:

是我們想要的。

再如:

select MAX(ID),name from [測試、] group by name

結果:

也是我們想要的。

但是說如果這樣的話:

select MAX(ID) as id,name from [測試、] group by name,id

得到的結果是:

很明顯這不是我們想要的。

所以這時候在使用聚合函式的地方若是使用了as另外命名,請不要在group by子句後再加上那個令命名的名字,否則就和文章剛開始出現的情況一樣