Oracle-24-聚合函式&group by的使用
一、聚合函式
1.count——返回找到的記錄數;
2.min——返回一個數字列或計算列的最小值;
3.max——返回一個數字列或計算列的最大值;
4.sum——返回一個數字列或計算列的綜合;
5.avg——對一個數字列或計算列求平均值;
例1:練習count函式
解:查詢當前登入使用者下的student表全部資訊:
用count查詢記錄數:
由此可以看出,count()括號既可以傳*也可以傳列名,如果傳入列名就是計算這一列非空資料的個數,比如這時在student表中插入一個新資料:
這時候再用count(*)和count(sname)查詢:
因為sname列最後一個數據為null,所以conut(sname)比count(*)少1。
例2:練習min和max函式
解:
例3:練習sum函式
解:
發現報錯,因為sum只能用於數字型別資料,如下則不報錯:
例4:練習avg函式
解:
同樣avg只能用於數字型別的資料,如下則不報錯:
【注意】avg只用於非空資料求平均,比如有11個數據,前10個有值,最後一個是null,那麼avg是將前10個相加之後除以10,而不是除以11。
二、GROUP BY
1.應用場景:
當一個SQL語句中有某表的一列+一個聚合函式,那麼就需要用group by,否則報錯,如下:
2.Group by子句定義(或作用):Group by主要可以用於將行分組為具有相同列值的多個部分。
如:SQL>select job from emp group by job;
說白了,group by就是將值相同的資料分在一組,如現在的student表:
那麼現在用group by:
例5:練習group by函式。
解:
上圖這條,就是先將student表按照ssex分組,男的一組,女的一組,不男不女一組,然後再呼叫聚合函式count計算每組個數。
【注意】分組group by一般與聚合函式連用,即先分組再聚合(如先分組再求和、先分組再求平均等等)
3.group by如果只是對行進行單獨的分組使用,那麼使用意義不大。在複雜的SQL查詢中Group by子句大多數時候與聚合函式一起出現。
如:查詢各個職位的平均工資是多少?
SQL>select job, avg(sal) from emp group by job;
上述SQL語句執行思路:
按照job列相同值為一組的原則,使用group by子句將表中資料分組,使用avg函式對每組資料分別求平均。
【group by總結】
如果查詢中包含一個聚合函式(如下面的sum函式),而所選擇的列(如下面的ssex)並不在聚合函式(如下面的sum函式)中,那麼這些列(如下面的ssex)就必須在group by子句中;否則就會報錯:ORA-00937:不是單租分組函式。
如:SQL>select ssex, sum(sage) from student group by ssex;簡單說,就是ssex沒被聚合函式sum修飾,那麼必須放在group by後面,否則必報錯。
例6:在當前登入使用者下的student表中查詢男生和女生的平均年齡。
解:
【總結】
SQL>select★,聚合函式(△) from A group by★;
其中★填寫的很簡單,根據誰分組就寫誰,比如根據性別分組,這★就是ssex組。執行的時候是先根據★分組,然後再在每個組裡面計算聚合函式。
例7:在當前登入使用者下的student表中,計算李姓學生的平均年齡。
解:
注意where的使用,更注意like的使用。
那麼如果希望查詢結果顯示“李”怎麼辦?如下:
substr(sname,1,1)是從sname列每個資料的第1個位置開始取子串,只取1個長度的子串,然後去匹配where sname like ‘李%’條件,根據substr(sname,1,1)分組,用聚合函式avg計算平均年齡。