Mysql的聚合查詢

聚合查詢:

如果我們要統計一張表的數據量,例如,想查詢students表一共有多少條記錄,難道必須用SELECT * FROM students查出來然後再數一數有多少行嗎?

這個方法當然可以,但是比較弱智。對於統計總數、平均數這類計算,SQL提供了專門的聚合函數,使用聚合函數進行查詢,就是聚合查詢,它可以快速獲得結果。
仍然以查詢students表一共有多少條記錄爲例,我們可以使用SQL內置的COUNT()函數查詢:

SELECT COUNT(*) FROM students;
  • 使用聚合查詢並設置結果集的列名爲num:

COUNT()表示查詢所有列的行數,要注意聚合的計算結果雖然是一個數字,但查詢的結果仍然是一個二維表,只是這個二維表只有一行一列,並且列名是COUNT()。
通常,使用聚合查詢時,我們應該給列名設置一個別名,便於處理結果:


SELECT COUNT(*) num FROM students;
  • 常見聚合函數
    所有的UDAF(即聚合函數)都應該支持分組查詢,內置的聚合函數有:

sum(列名) 求和      
max(列名) 最大值     
min(列名) 最小值     
avg(列名) 平均值     
first(列名)   第一條記錄   
last(列名)    最後一條記錄  
count(列名)   統計記錄數   注意和count(*)的區別
  • 聚合查詢並設置WHERE條件

COUNT(*)和COUNT(id)實際上是一樣的效果。另外注意,聚合查詢同樣可以使用WHERE條件,因此我們可以方便地統計出有多少男生、多少女生、多少80分以上的學生等:

SELECT COUNT(*) boys FROM students WHERE gender = 'M';

除了COUNT()函數外,SQL還提供瞭如下聚合函數:

  • Group By
    談到聚合查詢必然會涉及group by

“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”劃分成若干個“小區域”,然後針對若干個“小區域”進行數據處理。

聚合函數和分組查詢結合在一起,可以更方便靈活地進行數據查詢。

SELECT COUNT(*) boys FROM students GROUP BY age; 
  • Having與Where
    where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,where條件中不能包含聚組函數,使用where條件過濾出特定的行。

having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數,使用having 條件過濾出特定的組,也可以使用多個分組標準進行分組。

結合之前的文章,總結一下過濾的順序

on->join->where->group by->having

解釋一下,on是在join之前,很容易理解,join要根據on的條件生成鍵進行MR計算,where對於發生在join 之後,因此where裏的過濾條件不會減少數據輸入量,不過分區限制會。group by會對where過濾後的數據分組並進行聚合,having則對聚合後的結果再進行過濾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章