1. 程式人生 > 其它 >Oracle筆記08——Oracle分組函式

Oracle筆記08——Oracle分組函式

一、MIN函式和MAX函式
基本語法:
求最小值:MIN([DISTINCT | ALL] 列名 | 表示式)
求最大值:MAX([DISTINCT | ALL] 列名 | 表示式)
注意:MIN和MAX可以用於任何資料型別

--MIN()和MAX()
--1.查詢最早和最晚的入職日期
SELECT MIN(hiredate), MAX(hiredate) FROM emp;--用於日期型別
--2.查詢薪資最低與薪資最高的兩個員工
SELECT MIN(sal), MAX(sal) FROM emp;--用於數值型別
--3.查詢最小與最大的姓名
SELECT MIN(ename), MAX(ename) FROM
emp;

二、SUM函式和AVG函式
基本語法:
求和:SUM([DISTINCT | ALL] 列名 | 表示式)
求平均值:AVG([DISTINCT | ALL] 列名 | 表示式)
注意:SUM和AVG函式都是隻能夠對數值型別的列或表示式操作

--SUM()和AVG()
--1.查詢所有員工的平均工資和工資總和
SELECT AVG(sal), SUM(sal) FROM emp;

三、COUNT函式
作用:返回滿足條件的每組記錄條數
基本語法:
COUNT([DISTINCT | ALL] * | 列名 | 表示式)
注意:除了COUNT(*)之外,其它所有分組函式都會忽略列中的空值,然後進行計算

--COUNT()
--1.查詢部門30有多少員工
SELECT COUNT(*) FROM emp WHERE deptno = 30;--效率低
SELECT COUNT(deptno) FROM emp WHERE deptno = 30;--效率高
--2.查詢部門30有多少員工領到了獎金
SELECT COUNT(comm) FROM emp WHERE deptno = 30;
--3.查詢所有員工的平均獎金
SELECT COUNT(comm), AVG(comm) 平均獎金 FROM emp;--不包括沒有獎金的人數
SELECT COUNT(NVL(comm,0)), AVG(NVL(comm,0
)) 平均獎金 FROM emp;--包括沒有獎金的人數

四、GROUP BY子句
作用:將表中滿足WHERE條件的記錄按照指定的列劃分成若干個小組
基本語法:
GROUP BY [列名 | 表示式]
注意:
①SELECT子句列表中,只允許放分組函式,以及出現在GROUP BY後面的列
②並不是GROUP BY後面的列一定要寫在SELECT列表中

--GROUP BY()
--1.查詢每個部門的編號,平均工資
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;--按單列分組
--2.查詢每個部門每個崗位的工資總和
SELECT deptno,job,SUM(sal) FROM emp GROUP BY deptno,job;--按多列分組

五、HAVING子句
作用:排除組結果
基本語法:
HAVING 條件

--HAVING
--1.查詢每個部門最高工資大於2900的部門編號,最高工資
SELECT deptno,MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900;

六、SELECT語句執行過程
1.通過FROM子句中找到需要查詢的表;
2.通過WHERE子句進行非分組函式篩選判斷;
3.通過GROUP BY子句完成分組操作;
4.通過HAVING子句完成組函式篩選判斷;
5.通過SELECT子句選擇顯示的列或表示式及組函式;
6.通過ORDER BY子句進行排序操作。

--SELECT語句的執行過程
SELECT deptno, job, AVG(sal)                           --5
  FROM emp                                             --1
 WHERE job IN ('SALESMAN', 'MANAGER', 'CLERK')         --2
 GROUP BY deptno, job                                  --3
HAVING AVG(sal) > 1000                                 --4
 ORDER BY 3 DESC;                                      --6

七、組函式的巢狀
分組函式最多允許巢狀兩層,單行函式可以無限巢狀

--組函式的巢狀
SELECT deptno,COUNT(1) FROM emp GROUP BY deptno;--各個部門的人數
SELECT AVG(COUNT(1)) FROM emp GROUP BY deptno;--各個部門的平均人數
SELECT MAX(AVG(COUNT(1))) FROM emp GROUP BY deptno;--錯誤,分組函式的巢狀太深