--count時盡量count(列名),count(*)也可以。
--count,max,min,sum,avg,median(中位數)
select count(empno),count(distinct job),max(hiredate),min(hiredate),sum(sal),round(avg(sal),2)
from emp;
--median:中位數(中間值),一組按大小順序排列的數據,處於中間位置的數。
--行數為奇數時取中間行的數值(19行/2取9行的值),偶數時取中間2行數值的平均值(若18行則中位數的值為(9行+10行)除以2)。
--如sal共15行,第8行即中位數(中間值)
select median(sal) from emp;
--使用group by統計每個部門的人數
select deptno,count(deptno)
from emp
where deptno is not null
group by deptno;
--group by 以職位分組,查詢出每個職位的最低和最高工資
select job,min(sal),max(sal)
from emp
group by job;
--數據統計時,語句中沒有group by時,select的選項只能出現統計函數(count(),sum(),max(),min(),avg());
--數據統計時,語句中有group by時,select的選項只能出現統計函數和group by排序使用的分組字段(即列名);
select job,count(ename) from emp group by job;
--數據統計時,使用嵌套函數時,無論與劇中有沒有group by ,select選項中只允許出現嵌套行數,其它字段均不允許出現。
--重復的列可以進行分組(GROUP BY),SQL語句執行順序為FROM,WHRER,GROUP BY,SELECT,ORDER BY
--查詢部門名稱,部門人數,平均工資,平均工作年限
SELECT D.DNAME 部門名稱,count(ename)部門人數,ROUND(AVG(SAL),2)平均工資,ROUND(AVG(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12),2)平均工作年限
FROM EMP E FULL OUTER JOIN DEPT D ON( E.DEPTNO=D.DEPTNO)
GROUP BY D.DNAME;
--查詢工資各個等級工資的雇員人數,平均工資
SELECT TRIM(S.GRADE),DECODE(S.GRADE,1,'A',2,'B',3,'C',4,'D',5,'E') 工資等級,COUNT(E.ENAME) 雇員人數,ROUND(AVG(E.SAL),2) 平均工資
FROM EMP E,SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
GROUP BY S.GRADE
ORDER BY 工資等級
--查詢領取佣金和不領取佣金的平均工資,平均工作年限,雇員人數
SELECT '不領取佣金',AVG(SAL)平均工資,ROUND(AVG(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12),2)平均工資年限,COUNT(EMPNO)雇員人數
FROM EMP E WHERE E.COMM IS NULL
UNION
SELECT '領取佣金',AVG(SAL)平均工資,ROUND(AVG(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12),2)平均工資年限,COUNT(EMPNO)雇員人數
FROM EMP E WHERE E.COMM IS NOT NULL;
--多字段分組
--GROUP BY 字段1,字段2
--查詢部門詳細信息:部門名稱,部門編號,部門位置,平均工資,總工資,雇員人數
SELECT D.DNAME,D.DEPTNO,D.LOC,ROUND(AVG(E.SAL),2),SUM(SAL),COUNT(E.ENAME)
FROM DEPT D,EMP E
WHERE D.DEPTNO=E.DEPTNO(+)
GROUP BY D.DNAME,D.DEPTNO,D.LOC;
--HAVING 必須和GROUP BY一起使用
--查詢所有平均工資大於2000的職位信息,平均工資,雇員人數
SELECT E.JOB,ROUND(AVG(SAL),2),COUNT(E.ENAME)
FROM EMP E
GROUP BY E.JOB
HAVING AVG(SAL)>2000;
--查詢不包含銷售的的工作名稱,從事同一工作的雇員工資總和,且工資大於5000,並按照從低到高排序
select E.JOB,SUM(E.SAL) A
from emp e
where e.job !='SALESMAN'
GROUP BY E.JOB
HAVING SUM(E.SAL)>5000
ORDER BY A DESC;