聚合函数:
count sum max min avg
count返回的结果集中行的数目
sum max min avg顾名思义。但是要注意聚合函数强调的是"结果集中……",强调了
现在进行的操作对象是结果集
注意NULL不参与聚合函数的预算,要想其参加运算那么要将其转换为非空的值
分组:
在一个查询中需要进行多次统计就需要就必须使用分组
where是分组前过滤,过滤的是原始数据。这样就过滤掉了不必要的数据提高了效率
having是分组后过滤,过滤的是统计结果
先要弄明白:分组,分组 什么才叫一组——前提条件当然是相同的才叫一组
比如:班级同学分两组,按照性别来分。只有都是男性才会在同一组
老师的笔记说得很清楚:分组函数运算每一组记录,每一组返回一个结果
比如:select deptno,job,avg(sal) from emp group by deptno,job 把deptno,job相同的(其余字段不用多考虑,就以这两个为关键)算作一组
所以最后Oracle返回的是九行数据,即九个结果
注意按照某些字段分组后,已经是"组"的概念了,个体的特性已经消失了。
按照什么分组,那么当然可以从结果集中得到这些字段!!!比如按照城市分组,就可以得到每一组的城市名。
除了分组字段以外的字段,其余的字段只可以参与聚合运算(count sum max min avg)——当然,前提是可以使用具体的聚合
函数,比如不可以avg(name),因为那么根本就不是数字!!!!!!!!!!
再次强调:比如(在这里我们假设没有按照comm分组)员工编号是"9527"的comm(提成),但是可以得到平均的comm.
因为现在是以"组"的概念存在的。已经不存在个体了。
核心思想:分组以后个体的概念消失了,是"组"的概念。
比如这里有学生的 姓名,年纪,性别,身高
按照身高分组——相同的身高在一个组。那么当然可以select 身高,其余的只可以用聚合函数了
按照性别分组——相同的性别放在一个组。那么当然可以select 性别,其余的只可以用聚合函数了
还有一个很值得注意:要是涉及到聚合,分组的时候order by的字段也只能是分组里的字段!!!!!!!!!!!!!!
只要涉及到聚合函数就要想到分组!!!!!!!!!!!
要是前面出现了聚合函数,且后面没有涉及到group by 那么这是最特殊的分组。在select里任意一个具体字段都不可以使用。
只可以使用聚合函数
这里有一堆这两天敲的实验数据:
select * from emp
select job,count(*) from emp group by job having count(*)>3
select job "工种" from emp where job='CLERK'--正确的
select job "工种",count(job) "此工种人数" from emp group by job--正确的
select count(*) "此工种人数" from emp where job='CLERK'--正确的
select job "工种",count(*) "此工种人数" from emp where job='CLERK'--错误的
select job "工种",sum(comm) from emp group by job--正确的
select job "工种",avg(comm) from emp group by job--正确的
select job "工种",max(comm) from emp group by job--正确的
select job "工种",min(comm) from emp group by job--正确的
select job "工种",sal "工资",sum(comm) from emp group by job--错误的
select job "工种",avg(sal) "平均工资",sum(comm) from emp group by job--正确的
select job "工种",max(sal) "最高工资",sum(comm) from emp group by job--正确的
select job "工种",max(mgr) "管理者为",sum(comm) from emp group by job--正确的
select job "工种",sum(mgr) "测试",sum(comm) from emp group by job--正确的
select job "工种",max(ename) "ename最大值",sum(comm) from emp group by job--正确的
select job "工种",count(mgr) "测试",sum(comm) from emp group by job--正确的
select job "工种",count(ename) "测试",sum(comm) from emp group by job--正确的
select job "工种",count(hiredate) "测试",sum(comm) from emp group by job--正确的
--关于分组后的order
select job "工种",max(sal) "最高工资",sum(comm) from emp group by job order by job desc--正确的
select job "工种",max(sal) "最高工资",sum(comm) from emp group by job order by comm desc--错误的
select job "工种",max(sal) "最高工资",comm "提成",sum(comm) from emp group by job,comm order by comm desc--正确的
select * from emp
--1clerk null
--2sale 300
--3sale 500
--4man null
--5sale 1400
--6man null
--7man null
--8ana null
--9pre null
--10sal 0
--11clerk null
--12clerk null