现实需求中,我们经常需要返回的是找出某一列的最大值、最小值、平均值、总和、行数等。所以不需要返回每一行的实际数据,浪费资源。 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一定是放在最后的。
|