一、分組函數(shù)概述
- 分組函數(shù)是對(duì)表中一組記錄進(jìn)行操作,每組只返回一個(gè)結(jié)果,即首先要對(duì)表記錄進(jìn)行分組,然后在進(jìn)行操作匯總,每組返回一個(gè)結(jié)果,分組時(shí)可能是整個(gè)表分為一組,也可能根據(jù)條件分成多組。
- 分組函數(shù)常用到以下5個(gè)函數(shù):
- MIN
- MAX
- SUM
- AVG
- COUNT
二、分組函數(shù)
- MIN函數(shù)和MAX函數(shù)
MIN和MAX函數(shù)主要是返回每組的最小值和最大值
- MIN([DISTINCT|ALL] 參數(shù))
- MAX([DISTINCT|ALL] 參數(shù))
- MIN和MAX可以用于任何數(shù)據(jù)類型
- 例如:查詢?nèi)肼氉钤绾妥钔淼娜掌?/li>
SELECT MIN(hiredate),MAX(hiredate) FROM emp;
- SUM函數(shù)和AVG函數(shù)
SUM和AVG函數(shù)分別返回每組的總和及平均值
- SUM([DISTINCT|ALL] 參數(shù))
- AVG([DISTINCT|ALL] 參數(shù))
- SUM和AVG函數(shù)都是只能夠?qū)?shù)值類型的列或表達(dá)式操作
- 例如:查詢職位以SALES開(kāi)頭的所有員工平均工資、最低工資、最高工資、工資和。
SELECT AVG(sal),MAX(sal),MIN(sal),SUM(sal) FROM emp WHERE job LIKE 'SALES%';
- COUNT函數(shù)
COUNT函數(shù)的主要功能是返回滿足條件的每組記錄條數(shù)
- COUNT(*|{[DISTINCT|ALL] 參數(shù)})
- COUNT(*):返回表中滿足條件的行記錄數(shù)
- 例如:查詢部門(mén)30有多少員工,查詢部門(mén)30有多少人領(lǐng)取獎(jiǎng)金
返回所有滿足條件:SELECT COUNT(*) FROM emp WHERE deptno = 30;返回參數(shù)滿足非空(NULL)條件下:
SELECT COUNT(comm) FROM emp WHERE deptno = 30;
- 組函數(shù)中DISTINCT
- DISTINCT會(huì)消除重復(fù)記錄后在使用組函數(shù)
- 例如:查詢所有員工的部門(mén)數(shù)量
SELECT COUNT(DISTINCT deptno) FROM emp;
- 分組函數(shù)中的空值處理
- 除了COUNT(*)之外,其他所有分組函數(shù)都會(huì)忽略列中的空值,然后再進(jìn)行計(jì)算。
SELECT AVG(comm) FROM emp;
- 在分組函數(shù)中使用NVL函數(shù)
- NVL函數(shù)可以使分組函數(shù)強(qiáng)制包含含有空值的記錄
SELECT AVG(NVL(comm,0)) FROM emp;
三、用GROUP BY子句創(chuàng)建數(shù)據(jù)組
- 通過(guò)GROUP BY子句可將表中滿足WHERE條件的記錄按照指定的列劃分成若干小組
- 在SELECT列表中除了分組函數(shù)那些項(xiàng),所有列都必須包含在GROUP BY子句中。
- 其中GROUP BY子句指定要分組的列
- 查詢每個(gè)部門(mén)的編號(hào),平均工資
SELECT deptno, AVG( sal) FROM emp GROUP BY deptno;
- GROUP BY所指定的列并不是必須出現(xiàn)在SELECT列表中。
SELECT AVG( sal) FROM emp GROUP BY deptno;
四、使用HAVING子句
- 不能再WHERE子句中限制分組
SELECT deptno,max(sal) FROM emp WHERE MAX(sal) > 2900 GROUP BY deptno; //注意:不能使用限制組
- 可以通過(guò)HAVING子句限制分組
- 記錄已經(jīng)分組
- 使用過(guò)組函數(shù)
- 與HAVING子句匹配的結(jié)果才輸出
SELECT deptno,max(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900;SELECT job,SUM(sal) PAYROLL FROM emp WHERE job NOT LIKE 'SALES%' GROUP BY job HAVING SUM(sal) > 5000 ORDER BY SUM(sal);
五、SELECT語(yǔ)句的執(zhí)行過(guò)程
- 通過(guò)FROM子句中找到需要查詢的表;
- 通過(guò)WHERE子句進(jìn)行非分組函數(shù)篩選判斷;
- 通過(guò)GROUP BY子句完成分組操作;
- 通過(guò)HAVING子句完成函數(shù)篩選判斷;
- 通過(guò)SELECT子句選擇顯示的列或表達(dá)式及組函數(shù);
- 通過(guò)ORDER BY子句進(jìn)行排序操作。
這個(gè)過(guò)程非常重要!?。?!
六、組函數(shù)的嵌套
- 注意:與單行函數(shù)不同,組函數(shù)只能嵌套兩層。
SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;