Oracle day3
学习内容
组函数
函数
分类 | 作用 |
---|---|
单值函数 | 对一个值、或者一个列进行操作,返回一个结果 |
分组函数 | 先分组,然后对每一组进行操作,每一组数据操作后分别得到一个结果 |
分组函数
组函数(分组函数),是指将数据按照某列的值进行分组后,然后使用组函数分别对每个分好的小组中的数据进行处理。所以组函数一般要结合着分组关键字group来使用。
统计分析(分组主要为了统计)
-
分组
group by… -
函数
avg… -
筛选(与where类似)
having… -
组函数:
avg 求平均值
count 计算有多少条数据
max 最大值
min 最小值
sum 求和不常用:
stddev 标准差
variance 方差 -
语句执行顺序
where–>group by分组–>执行组函数–>having筛选->order by -
组函数可以出现的位置:
1.select后面
2.having后面
3.order by后面
4.where后面一定【不能】出现组函数(因为where执行时组函数还未执行) -
where与having最大的区别:(与静态非静态很像)
where后面拿不到组函数执行结果,having可以。
注意:如果select/having语句后面出现了组函数,那么select/having后面没有被组函数修饰的列,就必须出现在group by 后面。
where和having对比
- where和having都是做条件筛选的
- where执行的时间比having要早
- where后面不能出现组函数
- having后面可以出现组函数
- where语句要紧跟from后面
- having语句要紧跟group by后面
group by和having的关系(与if else很像)
- group by可以单独存在,后面可以不出现having语句
- having不能单独存在,有需要的话,必须出现在group by后面
order by语句
- 如果sql语句中需要排序,那么就一定要写在sql语句的最后面
- order by后也可以出现组函数
使用分组函数
不结合group分组使用
注:如果不使用group分组的话,那么默认当前查询到的所有数据是一组
avg()
- 查询s_emp表中所有员工的平均工资
select avg(salary)
from s_emp;
count()
- 查询s_emp表*有多少条数据
select count(*)
from s_emp;
max()
- 查询s_emp表中所有员工中的最大工资
select max(salary)
from s_emp;
min()
- 查询s_emp表中所有员工中的最小工资
select min(salary)
from s_emp;
sum()
- 查询s_emp表中所有员工的工资总和
select sum(salary)
from s_emp;
stddev()
- 查询s_emp表中所有员工的工资的标准差
select stddev(salary)
from s_emp;
variance()
- 查询s_emp表中所有员工的工资的方差
select variance(salary)
from s_emp;
结合group分组使用
avg()
- 查询s_emp表中每个部门的平均工资
select dept_id,avg(salary)
from s_emp
group by dept_id;
排序:
max()
- 查询s_emp表中每个部门员工的最高工资
select dept_id,max(salary)
from s_emp
group by dept_id;
sum()
- 查询s_emp表中每个部门员工的工资总和
select dept_id,sum(salary)
from s_emp
group by dept_id;
count()
- 查询s_emp表中每个部门员工的人数
select dept_id,count(*)
from s_emp
group by dept_id;
分组之后使用各种组函数
select dept_id,count(*),min(salary),max(salary),sum(salary),avg(salary)
from s_emp
group by dept_id;
结合group分组以及having筛选使用
avg()
- 查询s_emp表中部门的平均工资大于等于1400的部门
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>=1400;
- 思考:上面的sql语句修改为如下,是否可以?
select dept_id,avg(salary)
from s_emp
where avg(salary)>=1400
group by dept_id;
答:不可以。where后面不能出现分组函数。
sum()
- 查询s_emp表中部门的总工资大于等于4000的部门
select dept_id,sum(salary)
from s_emp
group by dept_id
having sum(salary)>=4000;
其他实例
查询s_emp表中部门的平均工资大于等于1400的部门,并且显示出这些部门的名字,同时按照部门编号进行排序
- 第一步:查询出基本需求
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>=1400 order by dept_id;
- 第二步:加入多表查询,并且分别给表起别名
select
se.dept_id,avg(se.salary)
from
s_emp se,s_dept sd
group by
se.dept_id
having
avg(se.salary)>=1400
order by
se.dept_id;
- 第三步:查询出s_dept表中的部门名称,并且进行等值连接
select
se.dept_id,avg(se.salary),sd.name
from
s_emp se,s_dept sd
where
se.dept_id = sd.id
group by
se.dept_id
having
avg(se.salary)>=1400;
order by
se.dept_id;
- 第四步:select语句后出现了组函数,那么没有被组函数修饰的列放到group by分组后面
select
se.dept_id,avg(se.salary),sd.name
from
s_emp se,s_dept sd
where
se.dept_id = sd.id
group by
se.dept_id,sd.name
having
avg(se.salary)>=1400
order by
se.dept_id;
- 思考:是否可以把where后的条件筛选 转移 到having语句后面?
答:可以。将where后面的筛选语句转移到having后面,效果相同。但是能写到where后面的条件就写到where后面。先筛选再操作数据效率高。