分組查詢主要涉及到兩個子句,分別是:group by和having。
1、取得每個工作崗位的工資合計,要求顯示崗位名稱和工資合計
select job, sum(sal) from emp group by job;
采用group by,非聚合函數使用的字段必須參與分組。
如果使用了order by,order by必須放到group by后面。
2、按照工作崗位和部門編碼分組,取得的工資合計
● 原始數據
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇14行。
● 分組語句
select job,deptno, sum(sal) from emp group by job,deptno;
● 分組后的數據
SQL> select job,deptno, sum(sal) from emp group by job,deptno;
JOB DEPTNO SUM(SAL)
--------- ---------- ----------
PRESIDENT 10 5000
CLERK 10 1300
SALESMAN 30 5600
ANALYST 20 6000
MANAGER 30 5825
MANAGER 10 2450
CLERK 30 950
CLERK 20 1900
已選擇8行。
Group by中不能使用聚合函數。
如果想對分組數據再進行過濾需要使用having子句。
取得每個崗位的平均工資大于2000
select job, avg(sal) from emp group by job having avg(sal) >2000;
分組函數的執行順序:
1、 根據條件查詢數據
2、 分組
3、 采用having過濾,取得正確的數據
一個完整的select語句格式如下:
select 字段
from 表名
where …….
group by ……..
having …….
order by ……..
以上語句的執行順序:
1、首先執行where語句過濾原始數據
2、 執行group by進行分組
3、 執行having對分組數據進行操作
4、 執行select選出數據
5、執行order by排序