分組函數
通過本章學習,您將可以:
l瞭解組函數。
l描述組函數的用途。
l使用GROUPBY 子句數據分組。
l使用HAVING 子句過濾分組結果集
一,組函數:AVG、COUNT、MAX、MIN、SUM
語法:
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
1.工資總額:求和函數sum
select sum(sal) from emp;
SUM(SAL)
----------
29025
2.總人數:計數函數count
select count(*) from emp;
COUNT(*)
----------
14
3.平均工資:平均值函數avg,組函數忽略空值
select sum(sal)/count(*) 一,avg(sal) 二 from emp;
一 二
---------- ----------
2073.21429 2073.21429
這裏結果是一樣的,一、二都是計算平均工資4.平均獎金: 空值 5
select sum(comm)/count(*) 一, sum(comm)/count(comm) 二, avg(comm) 三 from emp;
一 二 三
---------- ---------- ----------
157.142857 550 550
count(*) :總行數
count(comm):有薪水的個數
select count(*), count(comm) from emp;
COUNT(*) COUNT(COMM)
---------- -----------
14 4
這裏可以使用 nvl與組函數使用。
select count(*), count(nvl(comm,0)) from emp;
COUNT(*) COUNT(NVL(COMM,0))
---------- ------------------
14 14
二、分組數據
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
可以使用GROUPBY子句將表中的數據分成若干組
1.求每個部門的平均工資
select deptno,avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667
2.先按照部門分組,再按照工作分組。
select deptno,job,sum(sal) from emp group by deptno,job order by 1
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
已選擇9行。
SELECT a,b,...n, group_function(column)
FROM table
[GROUP BY a,b,...n][ORDER BY column];
沒有在組函數中的 列 (a,b,...n)必須 出現在 GROUP BY 後(GROUP BY a,b,...n)
但是反過來並不一定了。
3.過濾分組:HAVING子句
使用HAVING 過濾分組:
①. 行已經被分組。
②. 使用了組函數。
③. 滿足HAVING 子句中條件的分組將被顯示。
eg:求10號部門的平均工資select deptno,avg(sal) from emp group by deptno having deptno=10;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
注意:HAVING 與 WHERE 功能相當。
區別:HAVING後可以帶有分組函數的,WHERE後 不可以
即可以使用WHERE的地方,HAVING都可以;但是,能用WHERE的地方盡肯能使用WHERE。
4.group by 增強: rollup(a,b,c)
group by rollup(a,b)
<==>
group by a,b
+
group by a
+
group by null
eg:
break on deptno skip 2
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750
20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400
29025
已選擇13行。
break on null
注:break on cols :一下每列出現重複只顯示一次