聚合函數:
SQL中提供的聚合函數可以用來統計、求和、求最值等等。
此處采用Oracle 11g中其他用戶SCOTT中的EMP表,進行演示。
–COUNT:統計行數量
COUNT(*)統計的是結果集的總條數,而count(字段)統計的是該字段中不為null的總條數
1、查詢有多少崗位
1 selete count(distinct job) from emp;
2、查詢員工總數 入職時間 最高工資 工資總額 平均工資
1 selete count(empno), 2 to-char(min(hiredate),'yyyy-mm-dd')||'----'||to_char(max(hiredate),'yyyy-mm-dd') as 入職時間, 3 max(sal),sum(sal),avg(sal) 4 from emp;
–SUM:獲取單個列的合計值
3、查詢工資總額
1 selete sum(sal) from emp;
–AVG:計算某個列的平均值
–MAX:計算列的最大值
–MIN:計算列的最小值
4、查詢最早入職時間
1 selete min(hiredate) from emp;
–group by 分組函數 一般與聚合函數組合用
5、查詢每個崗位最高工資
1 selete job,max(sal) from emp group by job;
6、查詢崗位平均工資>2500
易錯:
1 select job,avg(sal) 2 from emp 3 group by job 4 where sal>2500
當改寫成:
1 select job,avg(sal) 2 from emp 3 where sal>2500 4 group by job
執行結果:
雖然能執行出結果,但是它是將所有大於2500的工資的崗位,集合在一起,算平均工資,不符合要求。
應該改成:
1 select job,avg(sal) 2 from emp 3 group by job 4 having round(avg(sal))>2500
執行結果:
where和having的區別:
- where僅僅用於處理從from子句中返回的值。
- having子句通常是與order by子句一起使用的,因為having的作用是對使用group by進行分組統計后的結果再進行下一步的篩選。
7、查詢每個部門員工的平均工資 最高工資 工資總額 根據工資總額排序
1 selete deptno ,round(avg(sal)),max(sal),sum(sal) 2 from emp 3 group by deptno 4 order by sum(sal)
執行結果:
總結:SQL的執行順序:
–第一步:執行FROM
–第二步:WHERE條件過濾
–第三步:GROUP BY分組
–第四步:執行SELECT投影列
–第五步:HAVING條件過濾
–第六步:執行ORDER BY 排序