天天看點

對oracle中分組函數的一點感悟

一、當使用分組函數時,分組函數隻能出現在選擇清單、order by 和 having 子句中,而不能出現在 where 和 group by 子句中。

另外,使用分組函數還有以下一些注意事項:

1、 當使用分組函數時,除了函數 count(*) 之外,其他分組函數都會忽略 null 行,當然 count(列名) 也會忽略 null 行。

2、 當執行 select 語句時,如果選擇清單時包含列、表達式和分組函數,那麼這些列和表達式必須出現在 group by 子句中。

3、 當使用分組函數時,在分組函數中可以指定 all 和 distinct 選項。其中 all 是預設選項,該選項表示統計所有行資料(包括重複行);如果指定 distinct,則隻會統計不同行值。

4、 Having 是在 group by 語句之後。

二、group by 用于對查詢結果進行分組統計,而 having 子句則用于限制分組顯示結果。注意,如果在選擇清單中同時包含列、表達式和分組函數,那麼這些列和表達式必須出現在 group by 子句中。

三、使用 group by 子句、where 子句和分組函數有以下一些注意事項:

1、分組函數隻能出現在選擇清單、having 子句和 order by 子句中

2、如果在select 語句中同時包含 group by 、having 以及 order by 子句,則必須将 order by 子句放在最後。預設情況下,當使用 group by 子句統計數組時,會自動按照分組列的升序顯示統計結果。通過使用 order by 子句,可以改變資料分組的排序方式。

3、如果選擇清單包含有列、表達式和分組函數,那麼這些列和表達式必須出現在 group by 子句中,否則會顯示錯誤消息。

4、當限制分組顯示結果時,必須要使用 having 子句,而不能在 where 子句中使用分組函數限制顯示結果,否則會顯示錯誤資訊。】

四、關于為什麼有些SQL語句需要在 使用where初步過濾後,還需要在後面跟随group by分組語句。

例如:select deptno , avg(sal)

from emp

where deptno=20

這種語句會在oracle中報錯,但是在mysql中卻不會出現錯誤。

出錯的原因是:在員工表 emp中, 部門号碼為20 的員工有好幾個,

但是該部門的平均工資隻有一個,會出現多對一的現象,進而會報錯。

修正後的句子為:

select deptno , avg(sal)

from emp

where deptno=20

group by deptno

該SQL語句與上述語句不同,通過分組,使得部門是20 的員工同在一個組中,而平均工資也是在一個結果,進而是 一對一 是以 該SQL語句可行。

需要特别注意。