===================================================
分组函数
1 对列和行操作,单行函数只能对一行操作
2 能自动滤空
核心
avg 求平均值 count求个数 max求最大值 min求最小值 sum求和
求员工工资的总和
select sum(sal) from emp;
员工人数
select count(ename) from emp; 同级指定列的非空行数,重名的也算
select count(*) from emp; 这样写,oracle会自动取 列里无空值(null) 的列来计算,因为会自动滤空,所以我们不好自己指定列来进行算数运算
比如 sum(sal)/count(comm) 我们打算这样求平均工资,但是comm有很多为空的,会自动滤空,就是不算空的个数
当然我们可以用sum(sal)/count(nvl(comm,0)) 来代替自动滤空
求平均工资
select avg(sal) from emp; 只需要把指定的列加进来就能统计平均数,因为会自动滤空,所以不用考虑sal为空的情况
求公司职员的种类个数
select count(distinct job) from emp; distinct作用于列的前面,所以应该是写在job前面,而不是写着count前面,因为我们求的是种类个数,所以要去除重复的种类
分组数据
1 对数据进行分组用,比如求出每个部门的平均工资
2 group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,
然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选
3 用group by 的时候,select 列表中没有被包含在组函数中的列,都必须在group by后面出现,比如select deptno,avg(sal) from emp group by deptno;
deptno没有被包含在组函数中,所以必须在group by 的后面出现,而sal被组函数包裹着,所以不需要
4 select deptno,avg(sal) from emp; 这条语句乍看起来没错,但其实会报错,因为单组分组函数,用了分组函数,那么一般就会指定一个分组,后面就要用group by
如果不用group by ,那么其实逻辑上是行不通的,这个不能用文字描述出来,太抽象了,能运用懂意思即可
核心
group by 数据分组
求出每个部门的平均工资
select deptno,avg(sal) from emp group by deptno; 会自动按deptno分组,会自动过滤重复组,然后按组进行运算,所以group by 是作用在查询之前的
where后面不能使用组函数,比如不能这样写where avg(sal)>2000;并不是说出现了where就不能出现组函数
=
=
=
=