SQL学习DAY2:聚合函数与分组统计

0 阅读4分钟

今天承接昨天的基础CRUD,进入了SQL的进阶部分——聚合查询与分组统计。通过8道任务题,系统掌握了聚合函数、分组、排序、分页以及HAVING过滤的用法,对SQL从"单条记录操作"走向"批量数据统计"有了完整的认知。


一、聚合函数

聚合函数的作用是对一组数据进行汇总计算,返回一个单一的统计结果。今天练习了四个最常用的聚合函数。MAX用于求某一列的最大值,比如查询所有产品中价格最高的那个。MIN用于求最小值,对应价格最低的产品。AVG用于计算平均值,能得出所有产品的平均价格。SUM用于求总和,比如统计所有产品的库存总量。

这四个函数可以放在同一条SELECT语句中一起查询,一次性拿到最高、最低、平均和总和四个数字,非常方便。需要注意的是,聚合函数会忽略NULL值,如果某条记录的对应字段为空,它不会被计入统计。

COUNT函数用于统计记录的总条数,COUNT(*)表示统计所有行,不管有没有NULL。这个函数在需要知道数据总量时非常常用,比如统计仓库里一共有多少种农产品。


二、分组统计

GROUP BY是今天最重要的关键字,它的作用是把数据按照某个字段的值分成若干组,然后对每组分别进行聚合计算。

比如按产地分组统计每个产地有几个产品,就是把所有记录按照origin字段的值归类,黑龙江的归一组、山东的归一组,然后对每组用COUNT统计数量。这样得到的结果不再是零散的单条记录,而是按维度汇总后的统计信息,这正是数据分析的核心能力。

分组后还可以对聚合结果进行排序。比如先按产地分组计算每个产地的平均价格,然后再按这个平均价格从高到低排序,一眼就能看出哪个产地的农产品整体定价更高。这种"先分组聚合、再排序展示"的套路在实际报表中非常常见。


三、HAVING与WHERE的区别

今天最大的收获是彻底理解了HAVING和WHERE的区别,这也是第8道思考题的核心。

WHERE用于在分组之前过滤原始记录,它筛选的是表中的行数据,不能跟聚合函数一起用。比如想只统计价格大于10元的产品,这个条件应该在分组前用WHERE过滤。

HAVING用于在分组之后过滤分组结果,它筛选的是聚合后的组,必须跟GROUP BY配合使用,而且条件中可以使用聚合函数。比如分组计算出每个产地的平均价格后,只想显示平均价格高于5元的那些产地,这个条件就必须用HAVING,因为"平均价格"是聚合计算后才能得到的值,WHERE阶段根本不存在这个值。

所以两者的根本区别在于执行的时机和作用的对象:WHERE在分组前对原始行过滤,HAVING在分组后对聚合结果过滤。如果第5题用WHERE代替HAVING,由于WHERE阶段还没有计算平均值,条件里写平均价格大于5就会报错或者逻辑错误。


四、LIMIT与分页

LIMIT用于限制查询结果返回的记录数量,在实际开发中主要有两种用法。

第一种是取前N条。比如查询价格最高的前3个产品,先按价格降序排列,再用LIMIT 3截断,只保留前三条。这种写法简单直接,常用于排行榜、热门推荐等场景。

第二种是分页查询。比如每页显示2条数据,要查第2页的内容。LIMIT后面跟两个数字,第一个数字表示跳过的记录数,第二个数字表示返回的记录数。第2页意味着已经跳过了第1页的2条,所以跳过2条、再取2条,写成LIMIT 2, 2。理解这两个数字的含义是分页的关键,第一个是偏移量,第二个是页大小。


五、今日总结

今天从单条记录的增删改查,进阶到了批量数据的统计分析。掌握了MAX、MIN、AVG、SUM、COUNT五个聚合函数,理解了GROUP BY分组的核心思想,理清了WHERE和HAVING的分工与执行顺序,学会了用LIMIT做TopN截取和分页查询。这8道题全部独立手写并运行验证,虽然中间有几道题卡了一阵子,尤其是HAVING的理解和LIMIT两个参数的含义,但通过反复试错和验证,最终都搞通了。SQL的查询能力在这节课后上了一个台阶,从"会操作数据"变成了"会分析数据"。