比如说这条语句:
select 单位名称,count(职工.id),sum(职工工资) from [表名]
group by 单位名称
我知道group by 的意思是分组,但我不是很明白,这个分组起到什么作用,还有从以上语句中 分组为什么只分 单位名称 这个字段.
初级选手,求解,非常感谢,这个问题挺困扰我的,可能是一时没开窍,求详解.太谢谢了!!!
select 单位名称,count(职工.id),sum(职工工资) from [表名]
group by 单位名称
我知道group by 的意思是分组,但我不是很明白,这个分组起到什么作用,还有从以上语句中 分组为什么只分 单位名称 这个字段.
初级选手,求解,非常感谢,这个问题挺困扰我的,可能是一时没开窍,求详解.太谢谢了!!!
那只能根据单位来分组。如果 select sum(工资) group by 单位名称,职工;
则是求所有单位每个职工的工资,显然没有意义,这跟未分组没区别。理解的办法是创建一张表,录入测试数据。
按照你想法输入不同SQL,再将预期结果与实际结果对比。
group by 单位名称这个就需要点oracle基础了,count()和sum()都是聚簇函数,select结果集的时候,且select中有用到聚簇函数,要把非聚簇函数之外的字段放到group by 的后边。分组的意思就是将对一个组别的员工的工资进行加总求和
--统计每个部门的员工数量和总工资
SQL> select d.deptno,count(e.empno),sum(e.sal)
2 from dept d,emp e
3 where d.deptno=e.deptno
4 /
select d.deptno,count(e.empno),sum(e.sal)
from dept d,emp e
where d.deptno=e.deptno
--如果不按照部门号分组,将会报错
ORA-00937: not a single-group group function
--且看错误提示:非单分组函数
--也就是在统计员工数量和总工资的时候,oracle不知道怎么统计
--如果将所有员工数量和所有员工工资和作为最后结果,那么这是错误的做法,
--否则怎么样统计呢?oracle不得而知......
--如果将deptno去掉,我们得到了一个没有任何意义的答案
SQL>
SQL> select d.deptno,count(e.empno),sum(e.sal)
2 from dept d,emp e
3 where d.deptno=e.deptno
4 group by d.deptno
5 /
DEPTNO COUNT(E.EMPNO) SUM(E.SAL)
------ -------------- ----------
10 3 8750
20 5 10975
30 6 9400
--按照deptno分组统计,我们才得到正确的答案
SQL> --在看下面一个实例
--找出每个部门中最高工资和最低工资
SQL> select deptno,max(sal),min(sal)
2 from emp
3 /
select deptno,max(sal),min(sal)
from emp
--如果不分组,会报错,
--我们是统计个部门,而不是整个员工表中的最高工资,和最低工资
ORA-00937: not a single-group group function
SQL>
SQL> select deptno,max(sal),min(sal)
2 from emp
3 group by deptno
4 /
DEPTNO MAX(SAL) MIN(SAL)
------ ---------- ----------
10 5000 1300
20 3100 800
30 2850 950
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句 限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询 结果。
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数
select max(sal),job emp group by job;
(注意max(sal),job的job并非一定要出现,但有意义)
查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
查询每个部门的每种职位的雇员数
select deptno,job,count(*) from emp group by deptno,job