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

Oracle筆記06——Oracle分組函式

一、MIN函式和MAX函式

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

二、SUM函式和AVG函式

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

三、COUNT函式

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

四、GROUP BY子句

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

五、HAVING子句

作用:排除組結果
基本語法:
HAVING 條件

六、SELECT語句執行過程

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

七、組函式的巢狀

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

七、練習

--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()
--1.查詢所有員工的平均工資和工資總和
SELECT AVG(sal), SUM
(sal) FROM emp; --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() --1.查詢每個部門的編號,平均工資 SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;--按單列分組 --2.查詢每個部門每個崗位的工資總和 SELECT deptno,job,SUM(sal) FROM emp GROUP BY deptno,job;--按多列分組 --HAVING --1.查詢每個部門最高工資大於2900的部門編號,最高工資 SELECT deptno,MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900; --2.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;--錯誤,分組函式的巢狀太深