SQL之聚集函数和数据分组
现实需求中,我们经常需要返回的是找出某一列的最大值、最小值、平均值、总和、行数等。所以不需要返回每一行的实际数据,浪费资源。
SQL提供了以下五种聚集函数来实现统计信息的返回。
AVG()
MAX()
MIN()
COUNT()
SUM()
举例子:
select AVG(price) AS avg
from table;
AS表示别名,可以让返回的列名更直观。
COUNT主要用来返回行的数目。
如果是COUNT(*),则返回表中所有行的数目,不管有没有列是空值。
COUNT(column),则会忽略NULL值所在的行。
SUM聚集函数中还可以组合算术运算。
select SUM(price*num) AS total
from table;
2.分组数据
以上我们可以对所有数据进行匹配或对where子句指定的行进行匹配,但是,如果我们需要对某列进行分组,以每一组的形式返回数据怎么办呢,就需要用到group by ,having将数据分成多个逻辑组,对每个逻辑组进行聚集计算。
例如,我们想要知道每个学生选了几门课:
select name, COUNT(*) AS num_class
from table
GROUP BY name;
GROUP BY 子句命令数据库对每个名字(每个人)计算课程数目,而不是所有人。最后以名字为组返回结果。
having过滤分组
比如,我们需要从上面的分组中过滤掉选课数目少于5门的同学,则需要用到HAVING,为什么不能用where来过滤呢,因为这里的课程数目是基于分组的聚集值,而where是针对行的,不能完成任务。
比如:
select name, COUNT(*) AS num_class
from table
GROUP BY name
HAVING COUNT( * )>=5;
那么,是不是在GROUP BY中不能用where呢,并不是。有时候where和having都要用,where用于在数据分组前进行过滤,having在分组后进行过滤。比如,需要返回选了五门课以上且每门课成绩大于60的同学。
select name, COUNT(*) AS num_class
from table
where grade>60
GROUP BY name
HAVING COUNT( * )>5;
这里的成绩是针对每门课而言的,需要用where过滤,不包括在分组中,符合成绩的课程数量是针对分组而言的。
如果想要分组的结果按照某一列顺序排序,可以在最后加上ORDER BY grade ASC/DESC
ORDER BY一定是放在最后的。