通过昨天晚上的研究,让我对group by等函数感到很多的不解。对于其的用法感到很困惑。学而不思则罔,思而不学则殆。动手研究,今天先进行一点。

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
 

此时,我想分别统计出其中的最高工资获得者。怎么办

SQL>
SQL> select max(sal)
  2  from emp;

  MAX(SAL)
----------
     5000

SQL>

通过sum函数可以找到表中的最高工资,那么我如何找到得到最高工资者的全部信息呢?

SQL> select ename,job,max(sal) from emp;

select ename,job,max(sal) from emp

ORA-00937: 不是单组分组函数

SQL>

自然而然想到这样,得到错误。改变查询

SQL> select ename,job
  2  from emp
  3  where sal=max(sal);

select ename,job
from emp
where sal=max(sal)

ORA-00934: 此处不允许使用分组函数

SQL>

仍然不可以,通过查资料懂得,分组函数是对表中一组记录进行操作,每组只返回一个结果即首先要对表记录进行分组然后再进行操作汇总,每组返回一个结果。分组时可能是整个表分为一组,也可能根据条件分成多组。分组函数常用到min,max,sum,avg,count。这里就明白了为什么刚才两个查询的错误点,max返回了一个结果,这个结果自然没法在select中和其他的列同级使用;但是为什么第二种查询也不对呢?这就要考虑到oracle语句的执行顺序。sql语句的执行顺序是1,from子句找数据来源。2,where语句找条件。3,group by语句划分组。4,使用聚合函数计算。5,使用having筛选分组。6,计算所有表达式。7,select字段。看到这里就明白了,先做where条件,可是where条件都还没找到呢,自然执行不下去了。想到这里,豁然开朗。老老实实修改查询。


SQL>
SQL> select * from emp
  2  where sal=(
  3  select max(sal) from emp);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7839 KING       PRESIDENT       1981-11-17    5000.00               10

SQL>

通过嵌套查询,执行成功,也符合逻辑,先子查询,后父查询。

      说说我的心情吧。今天圣诞节,马上就元旦了,我的女朋友远在郑州,她非常想来看我,可是此刻的我竟然苦逼到连往返的卧铺车票钱都不够。下午,她给我发了条短信,我看到这条短信,眼泪就在眼眶里打转,她写到“我老老实实在家里等你回来,你好好吃饭,别省钱”。啥都不说了。。。。