[SQL入門級] 接上篇,繼續查詢

距離上一篇時間隔得蠻久了,這篇繼續查詢,簡單總結一下聚合函數、分組的知識。html

1、聚合函數(組函數/多行函數)sql

何謂多行函數,顧名思義就是函數做用於多行數據得出一個輸出結果,什麼意思呢?看圖:函數

image

那麼經常使用的有哪些這樣的函數呢?spa

AVG(平均值)3d

SUM(合計)htm

COUNT(計數)blog

MAX(最大值)get

MIN(最小值)it

STDDEV(標準差)io

組函數使用的語法,用法很簡單,但有兩點要注意:

image

I. 函數參數類型

  1. 數值型數據使用AVGSUM函數
  2. 任意數據類型的數據使用MIN、MAX、COUNT函數

II. 有關空值的處理

  1. 首先組函數是忽略空值的,例如COUNT(*)返回的是表中全部的記錄數,而COUNT(expr)返回的是expr字段不爲空的記錄數
  2. 那麼怎樣來處理空值呢,就要用到上一篇中提到的NVL函數,SELECT AVG(NVL(commission_pct,0)) FROM employees
  3. 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

image

如上語句,我想要表達的意思是:從僱員這張表中求出不一樣部門和不一樣工種的人的平均工資,輸出的格式是按照SELECT語句列表。那麼若是我從SELECT列表中隨便刪掉一個字段,改變的只是我輸出的格式,我仍是按部門和工種進行分類了;可是若是隻從GROUP

BY子句中刪掉job_id,則語句表達的意思就不能成立了,我按部門進行分組,可是部門中有不少個工種,結果到底要怎樣對應不得而知。

 

HAVING子句,過濾分組

  • WHERE子句的做用是篩選知足條件的數據行,即在分組以前過濾數據,條件中不能使用聚合函數;使用WHERE條件顯示特定的行;
  • HAVING子句的做用是篩選知足條件的組,即在分組以後過濾分組,條件中常常包含聚合函數;使用HAVING條件顯示特定的分組;
相關文章
相關標籤/搜索