组函数:是指将数据按照某列的值进行分组后,
然后使用组函数分别对每个分好的小组中的数据进行处理。
所以组函数一般要结合着分组关键字group来使用
关键字:
group by:进行分组(可以单独存在)
having:分组之后进行数据的进一步筛选(只能出现在group by 的后面)
函数:
avg 求平均值
count 计算有多少条数据
max 最大值
min 最小值
sum 求和
stddev 标准差
variance 方差
组函数出现的位置:
1.select后面
2.having后面
3.order by后面
4.where后面一定【不能】出现组函数
注意:如果select/having语句后面出现了组函数,那么select/having
后面没有被组函数修饰的列,就必须出现在group by 后面
如果不使用group分组的话,那么默认当前查询到的所有数据是一组。
例子:
1.查询s_emp表中所有员工的平均工资
select avg(salary)
from s_emp;
2.查询s_emp表中共有多少条数据
select count(*)
from s_emp;
3.查询s_emp表中所有员工中的最大工资
select max(salary)
from s_emp;
4.查询s_emp表中所有员工中的最小工资
select min(salary)
from s_emp;
5.查询s_emp表中所有员工的工资总和
select sum(salary)
from s_emp;
6.查询s_emp表中每个部门的平均工资
select dept_id,avg(salary)
from s_emp
group by dept_id;
7.查询s_emp表中每个部门员工的最高工资
select dept_id,max(salary)
from s_emp
group by dept_id;
8.查询s_emp表中每个部门员工的工资总和
select dept_id,sum(salary)
from s_emp
group by dept_id;
9.查询s_emp表中每个部门员工的人数
select dept_id,count(id)
from s_emp
group by dept_id;
10. 查询s_emp表中部门的平均工资大于等于1400的部门
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>=1400;
11.查询s_emp表中部门的总工资大于等于4000的部门
select dept_id,sum(salary)
from s_emp
group by dept_id
having sum(salary)>=4000;
12.查询s_emp表中部门的平均工资大于等于1400的部门,
并且显示出这些部门的名字,同时按照部门编号进行排序
select se.dept_id,avg(se.salary),sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id
group by dept_id,sd.name
having avg(se.salary)>=1400
order by se.dept_id;
或者
select dept_id,sd.id,sd.name
from s_dept sd,(
select dept_id
from s_emp
group by dept_id
having avg(salary)>=1400
)temp
where sd.id=temp.dept_id
order by dept_id;
13. 查询s_emp表中最大的工资数,
并且显示出这个最大工资的员工的名字
select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
group by s2.last_name,s2.salary
having s2.salary=max(s1.salary);
14.查询s_emp表每个部门的最大工资数,并且显示出这
个最大工资的员工名字以及该部门的名字和该部门所
属区域,并且使用部门编号进行排序
//每个部门的最大工资数
select dept_id,max(salary)
from s_emp
group by dept_id
//
select s1.last_name,s2.dept_id,max(s2.salary),sd.name,sr.name
from s_emp s1,s_emp s2,s_dept sd,s_region sr
where s1.dept_id=sd.id and sd.region_id=sr.id
group by s2.dept_id,s1.salary,s1.last_name,sd.name,sr.name
having s1.salary=max(s2.salary)
然后使用组函数分别对每个分好的小组中的数据进行处理。
所以组函数一般要结合着分组关键字group来使用
关键字:
group by:进行分组(可以单独存在)
having:分组之后进行数据的进一步筛选(只能出现在group by 的后面)
函数:
avg 求平均值
count 计算有多少条数据
max 最大值
min 最小值
sum 求和
stddev 标准差
variance 方差
组函数出现的位置:
1.select后面
2.having后面
3.order by后面
4.where后面一定【不能】出现组函数
注意:如果select/having语句后面出现了组函数,那么select/having
后面没有被组函数修饰的列,就必须出现在group by 后面
如果不使用group分组的话,那么默认当前查询到的所有数据是一组。
例子:
1.查询s_emp表中所有员工的平均工资
select avg(salary)
from s_emp;
2.查询s_emp表中共有多少条数据
select count(*)
from s_emp;
3.查询s_emp表中所有员工中的最大工资
select max(salary)
from s_emp;
4.查询s_emp表中所有员工中的最小工资
select min(salary)
from s_emp;
5.查询s_emp表中所有员工的工资总和
select sum(salary)
from s_emp;
6.查询s_emp表中每个部门的平均工资
select dept_id,avg(salary)
from s_emp
group by dept_id;
7.查询s_emp表中每个部门员工的最高工资
select dept_id,max(salary)
from s_emp
group by dept_id;
8.查询s_emp表中每个部门员工的工资总和
select dept_id,sum(salary)
from s_emp
group by dept_id;
9.查询s_emp表中每个部门员工的人数
select dept_id,count(id)
from s_emp
group by dept_id;
10. 查询s_emp表中部门的平均工资大于等于1400的部门
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>=1400;
11.查询s_emp表中部门的总工资大于等于4000的部门
select dept_id,sum(salary)
from s_emp
group by dept_id
having sum(salary)>=4000;
12.查询s_emp表中部门的平均工资大于等于1400的部门,
并且显示出这些部门的名字,同时按照部门编号进行排序
select se.dept_id,avg(se.salary),sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id
group by dept_id,sd.name
having avg(se.salary)>=1400
order by se.dept_id;
或者
select dept_id,sd.id,sd.name
from s_dept sd,(
select dept_id
from s_emp
group by dept_id
having avg(salary)>=1400
)temp
where sd.id=temp.dept_id
order by dept_id;
13. 查询s_emp表中最大的工资数,
并且显示出这个最大工资的员工的名字
select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
group by s2.last_name,s2.salary
having s2.salary=max(s1.salary);
14.查询s_emp表每个部门的最大工资数,并且显示出这
个最大工资的员工名字以及该部门的名字和该部门所
属区域,并且使用部门编号进行排序
//每个部门的最大工资数
select dept_id,max(salary)
from s_emp
group by dept_id
//
select s1.last_name,s2.dept_id,max(s2.salary),sd.name,sr.name
from s_emp s1,s_emp s2,s_dept sd,s_region sr
where s1.dept_id=sd.id and sd.region_id=sr.id
group by s2.dept_id,s1.salary,s1.last_name,sd.name,sr.name
having s1.salary=max(s2.salary)
order by s2.dept_id desc;