目录
分组查询
概念
组函数
练习
练习
分组查询
概念
所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对该组的数据进行组函数运用,针对每一组返回一个结果。
tips:
1.组函数可以出现的位置: select子句和having 子句
2.使用group by 将将行划分成若干小组。
3.having子句用来限制组结果的返回。
语法以及执行顺序
SQL | 顺序 |
select ... | 5 |
from ... | 1 |
where ... | 2 |
group by col_name,col_name | 3 |
having ... | 4 |
order by... | 6 |
执行的时候,先from,再where限制每一条记录的返回,返回结果进行分组,应用组函数,再用having限制组函数返回的结果,接下来是select抽取要显示的列,最后排序
group by col_name:即将数据按照col_name相同值进行分组
组函数
常见有5个:
avg:求平均值
count:求总数
max:最大值
min:最小值
sum:求和
avg([distinct] column )/sum([distinct] column) :可以作用在存储数字数据的列上。
max(),min():可以作用在任意类型的数据之上。对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。
count([distinct] column | *) :
count(*) : 统计表中所有的行数
count(column) : 返回所有非空行的行数
group by 子句
1.用来将表中的行划分成若干更小的组
2.出现在select子句中,但是没有出现在组函数中的列必须出现在group by子句中
3.出现在group by中的列不一定出现在select子句中。
4.group by子句中的列出现在select结果中,表意性比较强。
5.当group by子句中出现多列的时候,表示按照从左至右的顺序进行分组,即先按照第一列分组, 然后再第一列分好的组里面 按照第二列进行分组,以此类推。
6.限制组结果的返回一定使用having不能使用where
练习
1.查看各部门,职称相同的人的平均工资。
目标查询: 平均工资
from : s_emp
条件 : 各部门 ,职称相同。
select dept_id,title, avg(salary)
from s_emp
group by dept_id,title;
order by avg(salary);
2.查看所有部门的部门工资总和,按照部门工资的降序排序
目标 : sum(salary)
from :s_emp
条件 :各部门工资
select dept_id, sum(salary) s
from s_emp
group by dept_id
order by s desc;
3.查找部门平均工资>1000的所有部门的id和平均工资
目标: 部门id 和 avg(salary)
from: s_emp
条件: 部门平均工资
部门平均工资>1000
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>1000
order by dept_id;
having用法
限制组结果的返回。
1.如果希望限制组结果的返回,那么直接使用having子句跟在group by 子句之后。
练习
1.查看职称不以VP开头的所有员工,
2.并且将他们以职称分组,
3.求各职称的工资总和,
4.将工资综合>5000的职称和工资总合显示出来。
目标:title sum(salary)
from: s_emp
条件:职称不以VP开头 title not like 'VP%'
group by:各职称
限制组结果: sum(salary)>5000;
select title,sum(salary) sumS
from s_emp
where title not like 'VP%'
group by title
having sum(salary)>5000
order by sumS desc;