Oracle 分組統計查詢
基本統計函式的使用 count(*|欄位|[distinct]) max(欄位(日期或數字)) min(欄位) sum(數字欄位) avg(數字欄位) |
--查詢員工的最高工資和最低工資 select max(sal),min(sal) from emp e; --查詢最晚和最早被僱傭的員工日期 select max(e.hiredate),min(e.hiredate) from emp e; --統計所有員工的總工資已經平均工資 select sum(e.sal),avg(e.sal) from emp e; ---統計員工的平均服務年限 select trunc(avg(months_between(Sysdate,e.hiredate))/12) from emp e; |
count(*),count(欄位),count(distinct 欄位)的區別; 1.count(*):明確的返回表中的資料個數;是最準確的; 2.count(欄位):不統計為null的資料個數,如果某一列的資料不可能為空,那麼結果與count(*)相同; 3.count(distinct 欄位):統計消除重複資料後的資料個數 |
語法結構 分組統計查詢 【5.確定要使用的資料列】select [distnct]分組欄位[別名],....|統計函式 【3.針對資料實現分組操作】[group by 分組欄位,分組欄位,....] 【4.針對分組後的資料進行過濾】[having 分組後的過濾條件] 【6.針對返回的結果進行排序】order by 欄位[asc|desc,...] |
---按照職位分組,統計每個職位的名稱,人數,平均工資; select job,count(*),avg(sal) from emp group by job; ---要求查詢出每個部門編號,以及每個部門的人數、最高和最低工資 select c.deptno,count(*),max(sal),min(sal) from emp c group by c.deptno; |
---分組統計查詢的限制 1.在沒有編寫group by 子句的時候(全部作為一組),那麼select子句中只允許出現統計函式,不允許出去任何的其他欄位 錯誤寫法: select count(*),ename from emp; 2.在使用group by字句分組的時候,select子句之中只允許出現分組欄位和統計函式,其他欄位不允許出現; 錯誤寫法:select job,count(*),ename from emp e group by job; 3.統計查詢允許巢狀查詢,但是巢狀後的統計查詢中,select子句裡不允許再出現任何的欄位,包括分組欄位,只能使用巢狀的統計函式; |
錯誤寫法: select e.deptno,Max(avg(sal)) from emp e group by deptno; 正確寫法 select Max(avg(sal)) from emp e group by deptno; |
---分組查詢(多表查詢) 步驟: |
--查詢每個部門的名稱,平均工資,人數 select d.dname,avg(sal),count(*)
|
--1.where和having的區別? --a.where 發生在Group by操作之前,屬於分組前的資料篩選;where子句不允許使用統計函式; |
---顯示非銷售人員工作名稱以及從事同一工作僱員的月工資的總和,
錯誤程式碼 |
總結 1.不管是單表分組還是多表分組,重點看重複列,如果是一個重複列在group by後加一個欄位,如果有多個重複再group by後新增多個欄位; 2.分組中的使用限制: a.分組函式巢狀後不允許出現任何欄位; b.分組函式(統計函式)可以單獨使用,只有在使用了Group by後,在select子句中才可以欄位; 3.多表查詢與分組統計查詢的時候相當於是一張臨時表,所有的分組是在這種臨時表中完成的; |