距離上一篇時間隔得蠻久了,這篇繼續查詢,簡單總結一下聚合函數、分組的知識。html
1、聚合函數(組函數/多行函數)sql
何謂多行函數,顧名思義就是函數做用於多行數據得出一個輸出結果,什麼意思呢?看圖:函數
那麼經常使用的有哪些這樣的函數呢?spa
AVG(平均值)3d
SUM(合計)htm
COUNT(計數)blog
MAX(最大值)get
MIN(最小值)it
STDDEV(標準差)io
組函數使用的語法,用法很簡單,但有兩點要注意:
I. 函數參數類型
- 對數值型數據使用AVG和SUM函數
- 對任意數據類型的數據使用MIN、MAX、COUNT函數
II. 有關空值的處理
- 首先組函數是忽略空值的,例如COUNT(*)返回的是表中全部的記錄數,而COUNT(expr)返回的是expr字段不爲空的記錄數
- 那麼怎樣來處理空值呢,就要用到上一篇中提到的NVL函數,SELECT AVG(NVL(commission_pct,0)) FROM employees
- DISTINCT關鍵字表達的非空且不重複,COUNT(DISTINCT expr)返回的expr非空且不重複的記錄數
III. 不能在WHERE子句中使用組函數,這點結合後面的HAVING子句解釋。
IV. 組函數能夠嵌套使用
2、數據分組
GROUP BY子句,分組數據
意思咱就不廢話了,用的時候注意兩點:
- SELECT後面的全部列中,沒有使用聚合函數的列,必須出如今GROUP BY後面,反過來包含在GROUP BY子句的中的列卻沒必要包含在SELECT列表中。
- GROUP BY子句能夠包含多個列,贊成也適用規則1。
有點暈,什麼意思呢?我來解釋一下,判斷一個sql語句是否合法其實能夠試着去理解你要寫的sql語句要表達的實際想法,例如:
- select department_id,job_id,avg(salary)
from employees
group by department_id,job_id如上語句,我想要表達的意思是:從僱員這張表中求出不一樣部門和不一樣工種的人的平均工資,輸出的格式是按照SELECT語句列表。那麼若是我從SELECT列表中隨便刪掉一個字段,改變的只是我輸出的格式,我仍是按部門和工種進行分類了;可是若是隻從GROUP
BY子句中刪掉job_id,則語句表達的意思就不能成立了,我按部門進行分組,可是部門中有不少個工種,結果到底要怎樣對應不得而知。
HAVING子句,過濾分組
- WHERE子句的做用是篩選知足條件的數據行,即在分組以前過濾數據,條件中不能使用聚合函數;使用WHERE條件顯示特定的行;
- HAVING子句的做用是篩選知足條件的組,即在分組以後過濾分組,條件中常常包含聚合函數;使用HAVING條件顯示特定的分組;