在mysql中,可以利用select語句配合SUM()函數和“GROUP BY”來分組求和,語法為“SELECT 查詢字段 SUM(求和字段) AS 字段 FROM 表名 WHERE 條件 GROUP BY 分組字段一,分組字段二;”。
本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
mysql怎么分組求和
在mysql中,可以利用
SELECT?查詢字段?SUM(求和字段)?AS?字段?FROM?表名?WHERE?條件?GROUP?BY?分組字段一,分組字段二;
來進行分組求和。
示例如下:
1)count() 求某列的行數
很容易理解,count(列名)就是求某列的行數,值得注意的一點是該列不會計算空值的行數。舉例:
>– 查詢共有幾名教師
>– 查詢教師表共有多少行 SELECT COUNT(*) FROM teacher;
如果列中有重復值,我們計數不想計算重復值,怎么辦呢?我們可以使用distinct來解決:
-- 查詢成績表里共有幾個學生的成績 SELECT COUNT(DISTINCT 學號) FROM score;
2)sum() 對某列數據求和
求和,就是對某一列的數值進行求和,只能對數值進行計算。舉例:
-- 對所有成績求和 SELECT SUM(成績) FROM score;
3)avg() 對某列數值求平均值
同樣,平均值的計算只能對數值進行計算:
-- 對所有成績求平均值 SELECT AVG(成績) FROM score;
4)max() 求某列數據的最大值、min() 求某列數據的最小值
-- 獲取所有成績中的最大成績 SELECT MAX(成績),MIN(成績) FROM score;
分組
問題中,我們提到,需要知道每科成績的平均成績,那么我們就需要進行分組。
SQL中,group by語句可以根據一列或者多列對結果集進行分組。舉例:
-- 計算每一科課程的平均成績 SELECT 課程號,AVG(成績) FROM score GROUP BY 課程號;
在上篇文章中,我們就有簡單的介紹SQL語句執行順序:先執行from從哪個表獲取數據,再執行select語句;
這里我們從成績表獲取數據,使用group by語句將數據按某種規則進行分組;然后在分組的結果上進行計算count();最后select組合結果,把上一步的每一組計算結果總結到一個表中。
對分組條件指定條件
在一開始的問題里,要求“計算各科的平均成績并且得出平均成績大于等于80分”,以上兩節我們得到了計算每天一科的平均成績,現在對平均成績指定條件:“大于等于80分”,我們使用having子句。
having子句與where子句都是有條件的選取數據,不同的是where不能與匯總函數一起使用。
-- 計算平均成績大于等于80分的課程; SELECT 課程號,AVG(成績) FROM score GROUP BY 課程號 HAVING AVG(成績)>=80;
那是不是說,having子句的順序也是在select結果匯總的前邊呢?是的,having子句是對group by 的分組結果指定條件,比如要求大于等于80分,篩選出結果后,在進行結果匯總。
-- 對教師表根據教師姓名排序 SELECT * FROM teacher ORDER BY 教師姓名;
我們發現,空值NULL排在了最前面,所以:含有空值的列在排序時候,空值null會在開頭,當數據量很大想看空值的情況,就可以用這個排序。
另外,在補充一個limit語句,從查詢結果中取出指定行,比如,我們如果從剛才的查詢結果中只取第一行:
-- 計算平均成績大于等于80分的課程并根據成績降序排,并獲取第一行 SELECT 課程號,AVG(成績) FROM score GROUP BY 課程號 HAVING AVG(成績)>=80 ORDER BY AVG(成績) DESC LIMIT 1;
接下來我們進行一個總結。
用SQL解決業務問題分析思路
簡單來說:明確問題,將問題翻譯成大白話,逐步進行拆解,并寫出分析思路和對應的SQL思路。
1) 明確問題,將問題翻譯成大白話:
“計算各科的平均成績并且得出平均成績大于等于80分的課程并降序排列”翻譯成大白話就是:
“計算每一門課程的平均成績,然后根據得出的結果,進行大于等于80分的條件查詢,對查詢結果進行降序排列”。
2) 逐步進行拆解,并寫出分析思路和對應的SQL思路:
① 對課程號進行分組,計算每一門課程的平均成績;
② 對①的結果指定條件“>=80”;
③ 對②的結果進行降序排列;
我們可以把拆解后的思路套用到下方的公式中:
select 查詢結果 from 從那張表中查找數據 where 查詢條件(運算符、模糊查詢) group by 分組(每個) having 對分組結果指定條件 order by 對查詢結果排序 limit 從查詢結果中取出指定行;
試一下吧:
select 查詢結果[課程號,avg(成績)] from 從那張表中查找數據[成績表score] where 查詢條件(運算符、模糊查詢)[No] group by 分組(每個)[課程號] having 對分組結果指定條件[avg(成績)>=80] order by 對查詢結果排序[avg(成績)desc] limit 從查詢結果中取出指定行;[No]
這樣子,問題是不是就迎刃而解呢?
推薦學習:mysql視頻教程