通过昨天晚上的研究,让我对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>
通过嵌套查询,执行成功,也符合逻辑,先子查询,后父查询。
说说我的心情吧。今天圣诞节,马上就元旦了,我的女朋友远在郑州,她非常想来看我,可是此刻的我竟然苦逼到连往返的卧铺车票钱都不够。下午,她给我发了条短信,我看到这条短信,眼泪就在眼眶里打转,她写到“我老老实实在家里等你回来,你好好吃饭,别省钱”。啥都不说了。。。。