參考網址: https://zhuanlan.zhihu.com/p/245115561
聚合函數是什么
聚合函數是對一組值執行計算,並返回單個值的函數。常與 SELECT 語句的 GROUP BY 子句一同使用。
常見聚合函數有哪些
- count():計數,count(列名)不計算空值,count()計入空值
- sum():對一列數據求和,必須為數字
- avg():對一列數據求均值。值為null時,計算平均值時會忽略帶有null值的那一行
- min():最小值
- max():最大值
聚合函數應用的注意事項
- where子句后不能跟聚合函數
- having后可用聚合函數進行篩選
- 執行的優先順序為:where > group by > having > order by
- 運用group by之后,select中返回的字段只能出現聚合字段(或與之對應的唯一值)和聚合函數。舉個栗子:有學號、性別、年齡3個字段,如果group by性別,則只能返回性別及其相關聚合函數,如果返回年齡或者學號,則只會返回1行,往往和實際需求不符
聚合函數練習題
拿到SQL題目后,解題可分為3步(根據難易程度可進行省略):
- 翻譯成大白話
- 寫出分析思路
- 寫出對應的sql子句
world 表格
1、計算世界總人口
分析思路:“總人口”是所有人口相加,用sum函數
SELECT SUM(population)
FROM world
2、列出所有的洲名, 每個只有一次
大白話:表中洲去重后的名稱列出來
分析思路:用distinct
SELECT DISTINCT continent
FROM world
3、找出非洲(Africa)的GDP總和
分析思路:先找出非洲(where),再求和GDP(sum)
SELECT SUM(gdp)
FROM world
WHERE continent = 'Africa'
4、有多少個國家面積大於一百萬
分析思路:先篩選出面積大於一百萬的國家(where),再對這些國家進行計數(count)
SELECT count(name)
FROM world
WHERE area > 1000000
5、“法國”,“德國”,“西班牙”的總人口是多少?
分析思路:先篩選出法國”,“德國”,“西班牙”(where),再對這些國家人口進行求和(sum)
SELECT sum(population)
FROM world
WHERE name in ('France','Germany','Spain')
6、對每一個洲,展示洲份和國家的數量
分析思路:對洲進行分組(group by),然后對每組國家數量進行計數(count)
SELECT continent, count(name)
FROM world
GROUP BY continent
7、對每一個洲,展示洲份和至少有1000萬人口國家的數目
分析思路:先篩選出有1000萬人口的國家(where),然后對洲進行分組(group by),最后給出計數結果(count)
SELECT continent, count(name)
FROM world
WHERE population >= 10000000
GROUP BY continent
注意:這里篩選1000萬人口不能用having來完成,因為人口不是分組字段(continent才是),這是我最開始刷題時常常混淆的地方(指where和having)
8、列出有至少1億人口的洲
分析思路:先對洲進行分組(group by),然后計算每個洲的人口總和(sum),最后篩選出有1億人口的洲(having)
SELECT continent
FROM world
GROUP BY continent
HAVING SUM(population) >= 100000000
