oracle, group by, having

组查询
所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对改组的数据进行组函数运用
语法:
select ...
from ...
where ...
group by col_name,col_name
having ...
order by...


group by col_name:即将数据按照col_name相同值进行分组
组函数常见有5个:
avg:求平均值
count:求总数
max:最大值
min:最小值

sum:求和


分组函数的最大特点:把数据按照某个条件分完组之后,组函数可以分别对每个组中的数据进行运算


select    ...
from      ...
where     ...
group by  ...
having    ...
order by  ...

执行顺序:
where条件筛选-->group by分组-->组函数-->having条件筛选-->order by排序

where和having:
   1.where和having都是做条件筛选的
   2.where执行的时间比having要早
   3.where后面不能出现组函数
   4.having后面可以出现组函数
   5.where语句要跟着from后面
   6.having语句要跟着group by后面

group by和having
   1.group by可以单独存在,后面可以不出现having语句
   2.having不能单独存在,有需要的话,必须出现在group by后面

select、having和group by
   1.select或者having语句后面如果出现了组函数,那么其他的没有被组函数修饰的列就一定要出现在group by的后面.

order by
   1.order by如果需要的话,就一定要写在sql语句的最后面
   2.order by后也可以出现组函数


需求:查看所有部门的部门工资,按照部门工资的降序排序
select dept_id,sum(salary) dept_salary
from s_emp
group by dept_id
order by dept_salary desc;
练习:查看各个部门的最高工资
      查看各个部门的员工数
      查看各个部门的平均工资
      查看各个部门的最低工资

注意1:没有出现在group by子句中和组函数中的列,不能出现在select子句中
如:
select dept_id,last_name,max(salary)
from s_emp
group by dept_id;
(错误)并不能找到工资最大的员工名字
注意2:当group by子句中出现多列的时候,表示按照从左至右的顺序进行分组,即先按照第一列分组,然后再第一列分好的组里面 按照第二列进行分组,以此类推。
注意3:如果限制条件中出现了组函数,该条件必须放到having子句中,不能放在where子句中
需求:查看部门平均工资大于1000的部门id
select dept_id,avg(salary)
from s_emp
group by dept_id

having avg(salary) > 1000;


case:

查询每个部门的平均工资?对平均工资降序排序.平均工资大于1400.
select avg(salary)
from s_emp
group by dept_id
having avg(salary)>1400
order by avg(salary) desc;


查询各个部门各个职称的平均薪水和最大薪水,
并且平均薪水大于2000的部门id。
select dept_id,title,avg(salary),max(salary)
from s_emp
group by dept_id,title
having avg(salary)>2000;


查询title中不包含VP字符串的每个职位的平
均薪水,并对平均薪水进行降序排列,并且每个职位
的总薪水大于5000。
select avg(salary),title
from s_emp
where title not like '%VP%'
group by title
having sum(salary)>5000
order by avg(salary) desc;


查询41号部门的平均工资
select avg(salary)
from s_emp
where dept_id=41
group by dept_id;

select avg(salary)
from s_emp
group by dept_id
having dept_id=41;

select avg(salary)
from s_emp
where dept_id=41;

select avg(salary),dept_id
from s_emp
where dept_id=41
group by dept_id;


查看部门平均工资大于32号部门平均工资的部门id

select avg(se.salary)
from s_emp se
where se.dept_id=32;

select se.dept_id
from s_emp se
group by dept_id
having avg(se.salary)>(
select avg(se.salary)
from s_emp se
where se.dept_id=32
);


查询工资大于Smith所在部门平均工资的员工的信息  

select avg(salary)
from s_emp se
group by dept_id
having se.dept_id=(
select dept_id
from s_emp
where last_name='Smith'
);

select id,last_name,salary
from s_emp
where salary>(
select avg(salary)
from s_emp se
group by dept_id
having se.dept_id=(
select dept_id
from s_emp
where last_name='Smith'
)
);






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值