oracle分組函數(shù)筆記

分組統(tǒng)計查詢

分組函數(shù)展示

count(*|[distinct]列):求出全部記錄數(shù)
如果列上有null值則不統(tǒng)計,distinct重復(fù)記錄也不統(tǒng)計。建議用count(字段),必須用一個不可能為空字段。
sum:求出總和,操作列為數(shù)字
avg:平均值
max:最大值
min:最小值
median:返回中間值
variance:返回方差
stddev:返回標(biāo)準(zhǔn)差

注:所有的統(tǒng)計函數(shù)中只有count函數(shù)可以在表中沒有任何記錄的時候返回結(jié)果。

單字段分組統(tǒng)計操作

引入:正常情況下都允許重復(fù)數(shù)據(jù)分組,實際上也允許一條數(shù)據(jù)一組。
group by 子句
select子句中允許分組字段,統(tǒng)計函數(shù)

注:分組操作的若干限制
注意事項一:
如果在一個查詢中不存在group by 子句,那么在select子句之中只允許出現(xiàn)統(tǒng)計函數(shù),其他的任何字段都不允許出現(xiàn)。
注意事項二:
在統(tǒng)計查詢中,select 子句之中只允許出現(xiàn)分組字段和統(tǒng)計函數(shù)。
注意事項三:
統(tǒng)計函數(shù)允許嵌套使用,但是一旦使用了嵌套的統(tǒng)計函數(shù)之后,select子句之中不允許出現(xiàn)任何字段,包括分組字段。
例如:求出每個部門平均工資最高的工資
select max(avg(sal)) from emp group by deptno;
步驟:
多表查詢數(shù)據(jù)統(tǒng)計,臨時表分組,行列的組成結(jié)果一定是臨時表。
先確定表
確定關(guān)聯(lián)字段
根據(jù)規(guī)則進(jìn)行分組統(tǒng)計

例如:
統(tǒng)計出領(lǐng)取傭金與不領(lǐng)取傭金的雇員的平均工資、平均雇傭年限、雇員人數(shù)。

SELECT '領(lǐng)取傭金', ROUND(AVG(sal),2) avgsal,
    ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,
    COUNT(empno) count
FROM emp
WHERE comm IS NOT NULL ;
SELECT '領(lǐng)取傭金', ROUND(AVG(sal),2) avgsal,
    ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,
    COUNT(empno) count
FROM emp
WHERE comm IS NULL ;
SELECT '不領(lǐng)取傭金', ROUND(AVG(sal),2) avgsal,
    ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,
    COUNT(empno) count
FROM emp
WHERE comm IS NOT NULL 
    UNION
SELECT '領(lǐng)取傭金', ROUND(AVG(sal),2) avgsal,
    ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,
    COUNT(empno) count
FROM emp
WHERE comm IS NULL ;

多字段分組

注:多字段分組是group by 定義的多個字段,且多個字段必須同時重復(fù)。
having子句
與group子句進(jìn)行配合使用,對分組后的數(shù)據(jù)進(jìn)行統(tǒng)計過濾,因為where在group by 之前執(zhí)行,所以where中不允許使用統(tǒng)計函數(shù),所以只能利用having子句。
步驟

1.關(guān)聯(lián)表查出基本數(shù)據(jù)
2.臨時表分組

執(zhí)行順序

from->where->group by->having->select->order by

where與having區(qū)分

where:在分組之前使用(可以沒有g(shù)roup by),不允許使用統(tǒng)計函數(shù)
having:是在分組之后時候(必須有g(shù)roup by),允許使用統(tǒng)計函數(shù)

例子:
顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,并且要滿足從事同一工作的雇員的月工資合計大于$5000,輸出結(jié)果按月工資的合計升序排列
步驟一

SELECT * 
FROM emp
WHERE job<>'SALESMAN' ;

步驟二

SELECT job , SUM(sal) sum
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job ;

步驟三、

SELECT job , SUM(sal) sum
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job
HAVING SUM(sal)>5000 ;

步驟四、

SELECT job , SUM(sal) sum
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job
HAVING SUM(sal)>5000
ORDER BY sum ASC ;

特別注意:由于order by 最后執(zhí)行,所以可以使用select里的別名。

總結(jié)

戒驕戒躁

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容