9点30才下班,从电力大楼里出来,冷风吹得我直哆嗦。周围的繁华丝毫没有让我有驻足欣赏的心情,夜的兰州,真的好美。

       曾经看过一本书,博客上谈到学习IT的最好办法就是看其本身。就像学习linux一定要钻研它的内核,钻研java一定要从其本身的API和操作系统API入手。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行数据。这样的思路下,我们就可以明白,查询到的数据必须有分组的意义。

实在是太困了,下回再把这个文档写更清楚,大家平安夜快乐。晚安