IT之家 8 月 20 日消息,针对持续曝光的 AM5 插座烧毁事件,AMD 高管昨天在接受韩媒 Quasarzone 采访时表示,该问题源于主板制造...
2025-08-21 0
欢迎进入 SQL 的新篇章!
在之前的章节里,我们学习的都是如何处理单行数据——查询它、修改它、给它排序。但数据的真正威力,往往体现在聚合之中。
我们想知道的常常是这样的问题:
这些问题都无法通过简单地查看单行数据来回答。它们需要对一组数据进行计算和统计。这就是本章的主角——聚合函数 (Aggregate Functions) 和 GROUP BY (分组)——要解决的问题。
聚合函数会接受一组值作为输入,然后返回一个单一的、代表了这组值汇总信息的结果。
SQL 提供了几个非常常用的聚合函数:
函数 | 描述 |
COUNT() | 计算行数或非空值的数量。 |
SUM() | 计算一组数值的总和。 |
AVG() | 计算一组数值的平均值。 |
MAX() | 找出一组值中的最大值。 |
MIN() | 找出一组值中的最小值。 |
示例 1:我们一共有多少个朋友?
COUNT(*) 是最常用的,它会计算表中的总行数。
SELECT COUNT(*) AS "朋友总数" FROM friends;
结果:
朋友总数---------- 6(1 row)
示例 2:我们认识朋友的总年数是多少?
SUM() 会对指定的数值列进行求和。
SELECT SUM(years_known) AS "认识总年数" FROM friends;
结果(3+3+5+11+16+16 = 54):
认识总年数------------ 54(1 row)
示例 3:我们认识朋友最长和最短的年限分别是多少?
MAX() 和 MIN() 非常直观。
SELECT MAX(years_known) AS "最长年限", MIN(years_known) AS "最短年限"FROM friends;
结果:
最长年限 | 最短年限----------+---------- 16 | 3(1 row)
关于 COUNT 的一点说明:
比如,SELECT COUNT(DISTINCT years_known) FROM friends; 会返回 4 (3, 5, 11, 16)。
聚合函数本身已经很强大了,但它们的真正威力需要和 GROUP BY 子句结合才能完全释放。
GROUP BY 可以将表中的行,按照某一列或多列的值进行分组,所有在这些列上具有相同值的行会被划分到同一个组里。然后,聚合函数就可以对每个组分别进行计算了!
基本语法:
GROUP BY 子句在 WHERE 之后,ORDER BY 之前。
SELECT column1, aggregate_function(column2)FROM table_nameWHERE conditionGROUP BY column1ORDER BY ...;
黄金法则 ⭐:当一个 SELECT 语句中同时包含聚合函数(如 SUM, COUNT)和普通列时,所有不在聚合函数里的普通列,都必须出现在 GROUP BY 子句中!
示例 4:统计每个“认识年数”下分别有几个朋友
这个问题,只用聚合函数是无法回答的。我们需要先按 years_known 进行分组。
SELECT years_known, COUNT(*) AS friend_countFROM friendsGROUP BY years_knownORDER BY years_known;
执行过程揭秘 :
结果:
years_known | friend_count-------------+-------------- 3 | 2 5 | 1 11 | 1 16 | 2(4 rows)
看,我们得到了一个非常有价值的统计报告!
我们已经能按年分组统计人数了。现在,如果我想提出一个更进一步的问题:“只看那些人数超过 1 人的分组”,该怎么办?
我们可能会想当然地写:
-- 这是一个错误的示范!SELECT years_known, COUNT(*)FROM friendsGROUP BY years_knownWHERE COUNT(*) > 1; -- 错误!
执行它,数据库会无情报错!为什么?
因为 WHERE 子句是在分组之前(GROUP BY 之前)对原始的单行数据进行过滤的。在 WHERE 执行的时候,COUNT(*) 这个聚合结果根本还没算出来呢!
为了解决这个问题,SQL 提供了 HAVING 子句。
HAVING 子句专门用来对 GROUP BY 之后形成的分组结果进行过滤。
正确写法:
SELECT years_known, COUNT(*) AS friend_countFROM friendsGROUP BY years_knownHAVING COUNT(*) > 1ORDER BY years_known;
WHERE vs HAVING
WHERE | HAVING | |
作用对象 | 原始的、未分组的单行数据 | GROUP BY 之后形成的分组 |
执行时机 | 在 GROUP BY 之前 | 在 GROUP BY 之后 |
可使用函数 | 只能用在单行上的函数 | 可以使用聚合函数 |
一句话总结:WHERE 用来“筛选原料”,HAVING 用来“筛选出锅的菜品”。
本章小结
你已经解锁了数据分析的核心技能!这是从“数据操作”到“数据洞察”的关键一步。
你现在已经能够回答很多关于“数据整体”的复杂问题了。
在下一章,我们将学习 SQL 中另一个极其重要的概念——表连接 (JOIN)。我们将学习如何将多张表的数据关联起来,从而回答像“某个用户发表了哪些文章”这样的跨表查询问题。准备好构建更复杂的数据关系网了吗?我们下一章见!
相关文章
IT之家 8 月 20 日消息,针对持续曝光的 AM5 插座烧毁事件,AMD 高管昨天在接受韩媒 Quasarzone 采访时表示,该问题源于主板制造...
2025-08-21 0
金融界2025年8月20日消息,国家知识产权局信息显示,中车科技创新(北京)有限公司;中车大连机车车辆有限公司申请一项名为“一种共享系泊系统”的专利,...
2025-08-21 0
文 / 现代物流报记者 马敬泽在8月陆续声明杜绝不正当竞争后,美团、饿了么、京东等平台在外卖及非餐零售领域也逐渐延伸出自己的打法。8月以来,多家平台企...
2025-08-21 0
大家不愿意使用内置方案的主要原因就是:内置卡贴无法更新卡贴,每次新的解锁模式之后,需要邮寄华强北重新改卡,而外置卡贴只需要正常更换卡贴即可。最近超雪官...
2025-08-21 0
世界乱了。美国和俄罗斯一直较劲。俄罗斯被逼在一边。很多人在想以前苏联多厉害。苏联消失后,俄罗斯没那么强了。有人说过,如果俄罗斯和一个邻国能合在一起,会...
2025-08-21 0
走进北京亦庄的2025世界机器人大会,仿佛踏入未来工厂的预演场。宇树科技的G1人形机器人正进行高强度格斗,优必选的Walker S2灵活地搬运着工业料...
2025-08-21 1
在呼和浩特市南部产业带腹地,一场关乎区域开放格局的变革正加速推进。随着4F级盛乐国际机场转场进入倒计时,以其为核心的临空经济区正凭借政策、区位与产业优...
2025-08-21 1
近五年产业收入年均增长9.2%、集聚企业2180家,生命科学园内在研管线180余条、科学家创办企业112家……一连串数字,勾勒出北京昌平生命医药产业发...
2025-08-21 1
发表评论