談談分組:sql的group by+聚集函數 和 python的groupby+agg

直接舉例子+分析例子+總結來說,我先給幾個表:

學生表:student(學號,姓名,年齡,院系);
課程表:course(課程號,課程名,學分);
學生選課表:sc(學號,課程號,分數);

啥時候用分組呢?

我由簡至深來談。
1、比如讓我們查詢各個課程號及相應的選課人數。
首先定位到sc表上,“各個”很明顯就是要按課程分組,group by出場了,分組後對每組去統計選課人數,聚集函數出場了。
聚集函數就是一些統計指標:求和最大值最小值均值方差count這些。

select 課程號,count(distinct 學號)
from  sc
group by 課程號;

2、 比如查詢選修了3門以上課程的學生學號。
首先我們知道是定位到sc表上,再細讀一遍這句話,是選了3門以上課程的學生,那麼我們是不是要知道每一個學生選了幾門呢。當我們分析出了 “每個”“各個”“每天”等 這樣的字眼時,就知道要分組了,這時候group by就出場了。我們要先根據學生分組,分好後要去對每組做一個統計,統計什麼,統計每組有多少課程(即每個學號下有幾門課),然後過濾掉不滿足統計值的組,這就要用到having子句和聚集函數了。

select 學號
from sc
order by 課程號
having count(*)>3;

3、比如查詢平均成績大於等於90分的學生學號和平均成績。
平均成績,知道了要用到聚集函數avg()。再細讀這不是整體的平均成績,而是每個學生的平均成績,知道了要用分組group by。分組後,各組以一個學生爲單位。大於90分的學生,知道了要過濾掉小於90分的分組,having也出場了。梳理一下,就是先要分組,分組後,對每組的成績那列做一個avg的統計,最後用having+avg做一個過濾不合格分組。

select 學號,avg(grade) --select這裏返回的avg是統計指標滿足>=90的分組的
from sc
group by 學號
having avg(成績)>=90; 

總結一下grouyp by

簡單來說,就是用來分組的,同時對每個組做一些統計(聚集函數)。
細說:
group by 是這樣用的。它是和聚集函數一起的。如果我們要統計每組的統計特徵(求和最大最小均值方差count),我們可以用group by,再在select裏面去統計。如果我們要根據每組的統計特徵去篩掉一些組,我們可以用group by,再在having裏面去根據統計特徵的值過濾掉一些組。

python待補充
對應到python裏就是表名.group by([列名]).agg(列名:聚集函數)。

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