Oracle為我們設定了一個非常好的參考,那就是scott使用者和其中的員工表。今天就從emp表入手,共同研究研究group分組的用法。
SQL> select * from emp
2 ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
14 rows selected
這裡我們先對group by 函數進行少許的測試。SQL>
SQL> select deptno from emp;
DEPTNO
------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
14 rows selected
SQL>
SQL>
SQL> select deptno from emp group by deptno;
DEPTNO
------
30
20
10
SQL>
SQL> select job from emp group by job;
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
SQL> select deptno,job from emp
2 group by deptno,job;
DEPTNO JOB
------ ---------
20 CLERK
30 SALESMAN
20 MANAGER
30 CLERK
10 PRESIDENT
30 MANAGER
10 CLERK
10 MANAGER
20 ANALYST
9 rows selected
從道理上來講,(1式)select detpno from emp; 該語句的意思是找到emp 這張表,但是只顯示detpno這個列,所以,結果集全是表中原封不動的資料,但是只不過隱藏了一些列而已。但是加入group by語句之後,即(2式)elect deptno from emp group by deptno; 同樣是找到emp這張表,同樣是列出detpno這個列,出結果後再被group by 即對1式進行了後續操作,操作便是對1式的結果集按deptno進行分組,分組的結果是取消了很多重複的資料。用這樣的思路,select job ,deptno from emp gorup by job ,deptno。意味著先從emp中找到job 和 deptno列。,找到14行資料,之後按job和deptno進行分組。即意味著 以 {job,deptno} 的二元關係進行匹配。這樣便會取消幾個2元關係完全一樣的資料,所以出現了9行資料。這樣的思路下,我們就可以明白,查詢到的資料必須有分組的意義。