mysql的sql语句之分组
1.分组函数
- 多行处理函数的特点:输入多行,最终输出一行。
count 计数
sum 求和
avg 求平均值
max 最大值
min 最小值
注意:
1.分组函数必须在先分组,在使用。
2.如果没分组,整张表默认分为一组。
3.分组函数自动忽略null,可以计算。
4.分组函数不能直接使用在where子句中,因为select执行后,group by 已经执行了,而where执行后,group by 还没执行,违反了第一注意事项必须先分组。
案列:
# 找出最高成绩
select max(grade) from sc
# 统计多少数据
select count(grade) from sc
# 统计总行数
select count(*) from sc
# 最低成绩
select min(grade) from sc
# 平均值和四舍五入保留整数
select avg(grade) from sc
select round(avg(grade),0) from sc
#求和
select sum(grade) from sc
2. 分组查询
分组查询主要涉及倒两个子句,分别是:group by 和 having。
在实际操作中,可能需要,先分组,然后对每一组数据进行操作。
group by having
注意:在分组查询中select后只能是,分组函数和参加分组的字段,在mysql中不会报错,但无意义,在oracle数据库中会报错
select Sno from sc group by Sno
select Sno,sum(grade) from sc group by Sno
#Sno分组字段 sum 分组函数
# 每个同学不同科目的最高分
SELECT Sno,Cno,max(grade) FROM sc GROUP BY Cno,Sno
having和where的对比
列子:如找出每个部门的最高薪资,要求显示最搞薪资大于3000的?
having的方法
# 1.按部门分组,找出最大薪资
SELECT 部门,max(薪资) FROM 表名 group by 部门
# 2.大于3000的工资
SELECT 部门,max(薪资) FROM 表名 group by 部门 having max(薪资)>3000
where的方法
#1. 照出工资大于3000的
select 部门,薪资 from 表名 where 薪资>3000 group by 部门
对比这个列子中where比having更有效率.
注意:where和having优先选择where,where实在选择不了,在选择having,having智能在group by后使用
where无法使用的情况
如求每个部门的平均薪资,要求显示平均薪资大于2000
问题:这个要求where后无法使用分组函数,在分组函数中有提过优先级。
总结:
select from where group by having order by
这上面的先后循序
from
where
group by
having
select
order by