1. 程式人生 > >Oracle-24-聚合函式&group by的使用

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計算平均年齡。