MYSQL——聚合查询
聚合查询就是一些MYSQL中的内置函数
聚合查询本质上是针对数据表中的行和行进行计算
函数 | 说明 |
count([DISTINCT]expr) | 返回查询到的数据的数量,统计数据的行数 |
sum([DISTINCT]expr) | 返回查询到的数据的总和,不是数字没有意义 |
avg([DISTINCT]expr) | 返回查询到的数据的平均值,不是数字没有意义 |
max([DISTINCT]expr) | 返回查询到的数据的最大值,不是数字没有意义 |
min([DISTINCT]expr) | 返回查询到的数据的最小值,不是数字没有意义 |
以上操作都是针对某一列进行计算的
1.count();统计所有的行
推荐使用count(*),这种写法是SQL标准中规定的
指定某一列进行统计
若指定列中有null值,则null值不参与统计
2.sum(列名)求和
把查询结果中所有行中的指定列进行相加
注意:列的数据类型必须是数值型,不能是字符或日期
示例:计算学生语文成绩的总分
计算出来的学生语文成绩总分,结果在一个临时表中,计算出来的结果不受表中字段长度的约束
在计算语文分数的和时,可以使用别名
当进行运算时,运算数中有null时:
当使用sum()时,null值不参与计算
结果在一个临时表中,结果不受表中字段的长度约束
当 sun()中的字段不是数值类型时,会报一些警告
对同一个表中的多个列分别求和
语法格式:
select sum(列1),sum(列2),sum(列3) from 表名;
3.avg(列名)求平均值
对所有行的指定列进行求平均值的运算
对语文成绩求平均值
在计算语文成绩平均值时,可以使用别名
在计算平均值时,avg的参数可以是表达式
求三科成绩总分的平均值
4.max(), min()求最大值和最小值
对所有行的列求最大值和最小值
求最小值:
找出语文成绩的最大值:
同一列可以使用多个聚合函数:
多个聚合函数可以同时使用:
sum(),avg(),min(),max()均不能在非数值类型的字段使用
5.group by子句(分组查询)
select中使用group by 子句可以对指定列进行分组查询。需要满足:使用group by进行分组查询时,select 指定的字段必须是“分组依据字段”,其他字段想要出现在select中则必须包含在聚合函数中。
分组依据字段:对哪个列分组
其他字段:没有指定分组的字段,呈现是要通过聚合函数,比如求和,求平均值
语法:
select column1,sum(column2),avg(column3),......from 表名 group by column1,column4;
1.column1:分组的列名
2.sum(column2),avg(column3):没有被分组的列(需要运算的列,但是要显示结果,那么就需要用到聚合函数)
3.group by:分组的关键字
4.column1,column4:要分组的列名
示例1:计算不同部门的平均工资
MYSQL内部先分组再计算
round(数值,小数点的位数)
让各部门工资的平均保留两位小数:
group by之后可以跟order by子句
计算各部门的平均工资,按部门分组,然后按平均工资进行升序排序
HAVING(对分组后的结果进行条件过滤)
group by子句进行分组以后,需要对分组结果在进行条件过滤,不能使用where语句,而需要使用having
where是对表中每一行的真实数据进行过滤
having是对group by之后,计算出来的结果进行过滤
计算平均工资大于12000的部门:
having可以吧这个结果集中的数据进行过滤操作,平均工资这些数据并不是表中真正记录,而是通过聚合函数计算得出来的
having跟在group by子句后面,对分组后的结果进行过滤
where用在from表名之后,也就是分组之前
having跟在group by子句之后
where是对真实数据进行过滤,having是对分组的结果进行过滤
只需要在合适的位置写where和having即可
查询每个部门的最高工资,最低工资,总工资和平均工资
1.按部门分组
2.使用相应的聚合函数
6.补充
count()的特殊用法:
当count用在having后后面时,可以用来计算每个组有多少条数据
建立一张新表,将旧表中的指定列的数据导入到新表中
语法:
insert into 表名[(column1,coulmn2,.....)]select........
插入查询结果