分組統(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é)
戒驕戒躁