6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

时间:2021-07-08 17:04:08


1组函数 avg(),sum(),max(),min(),count()案例:

selectavg(sal),sum(sal),max(sal),min(sal),count(sal)

from emp

/

截图:

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

2
组函数和null在一起

案例:求员工的平均奖金

错误sql:

select avg(comm)
方式1,sum(comm)/count(comm)方式2,sum(comm)/count(*)
方式3

from emp;

截图:

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

错误原因:

select count(comm),count(*) from emp;

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

分析:

--组函数自己主动滤空,组函数忽略空值

--修正函数的滤空

select count(nvl(comm,0)),count(*) fromemp;

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

3.分组数据


求各个部门的平均工资

思路:须要把各个部门的数据划分….10部门
20部门 30部门….分组……

select deptno,avg(sal)

from emp

group by deptno;

执行结果:

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


组函数设计的本意

(1)、select检索的列
必需要位于group by后面的集合列中

(2)、组函数设计的本意:必需要在分组数据之上,进行结果集的检索….

注意:group by子句要求:全部在select中出现的列,都必须在出现group
by分组子句中。

select a, b, c

from emp

group by a, b, c,d;
这样的格式是对的,由于在select后的a、b、c都在groub
by后面。

select a, b, f

from emp

group by a, b, c,d; 
这样的格式是错的,由于在select后的f不在group中

4
在GROUP BY子句中包括多个列

--按部门 
不同的职位
统计平均工资

--先依照部门分组。在依照job分组,假设deptno和job一样,就是同一组。然后求平均工资。

--求各个部门的,每个工种的平均工资

select deptno,job,avg(sal),count(deptno)

from emp

group by deptno,job

order by 1;

截图:

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

5
分组过滤

--查询各个部门的平均工资

--进一步。查询平均工资大于2000的部门

select deptno,avg(sal)

from emp

group by deptno

having avg(sal) > 2000;

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

6 having和where子句差别

求10号部门的平均工资

方法1:先分组,在过滤

select deptno,avg(sal)

from emp

group by deptno

having deptno=10;

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

方法2:先过滤再分组

select deptno,avg(sal)

from emp

where deptno = 10

group by deptno;

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

7
关于sql优化

select * from emp;

select deptno, ename, ..., 
from emp 把要显示的全部的列都写出来,速度快,,不须要"翻译"

select *form emp

where (deptno = 10) and (deptno = 20) and (deptno=30)

<---------

oracle解析逻辑表达式
的方向....从右向左