聚合查询
在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!
1.聚合函数
函数 | 说明 |
COUNT([DISTINCT] expr) | 返回查询到的数据的数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的总和,不是数字没有意义 |
AVG([DISTINCT] expr | 返回查询到的数据的平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的最小值,不是数字没有意义 |
现在新建一个学生表如下:
count():返回查询到的数据的数量(即记录的总数)
conut内部的参数可以是*(此时相当于通配符,与select查询中的*意思一样),也可以是常数0,1,2......,也可以是字段名;
当参数为*或者常数时,返回的是此时表内所有记录的总数
当参数为字段名时,返回的是除了NULL记录之外的所有记录的总数
sum():返回查询到的数据的总和,不是数字没有意义
sum()将参数列的所有数据进行加和,在加和的同时该函数会自动规避掉NULL数据,避免了加和结果为NULL的情况发生
也可以对多个字段进行操作(同样可以对表达式起别名):
avg():返回查询到的数据的平均值,不是数字没有意义
avg()将参数列的所有数据进行加和,在加和的同时该函数会自动规避掉NULL数据,避免了加和结果为NULL的情况发生
也可以对多个字段进行操作(同样可以对表达式起别名):
max(),min():返回查询到的数据的最大值和最小值,不是数字没有意义
当同时使用两个聚合函数时,需要用逗号隔开;
注意:以上所有聚合函数在使用时,函数名后面的括号必须紧挨着函数名(这是SQL语法本身的原因)!
2.group by子句
select中使用group by子句可以对指定列进行分组查询,需要搭配聚合函数一起使用!
新建一个员工表如下:
根据每个员工的职位进行分组然后查询分组后每个职位的平均工资:
运算过程:把role这一列值相同的行分成一组,然后使用聚合函数针对每个分组分别计算!
搭配order by子句对分组后的数据进行排序:
如果没有使用聚合函数:
如果不使用聚合函数的时候,查询的结果会是每个分组的第一条记录,所以一开始在前面就说明了group by子句需要搭配聚合函数一起使用!
3.having子句
group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用where语句,而需要用having子句
查询分组后平均工资在10000以上的数据:
where和having的区别:
分组之前指定条件(先筛选,再分组):使用where
分组之后指定条件(先分组,再筛选):使用having
使用where的情况(统计每个岗位的平均工资,但是刨去汤老湿的数据):
使用having的情况(查询每个岗位的平均工资,但是刨去平均工资在10000以下的数据):