SQL聚合函数面试题常考什么?SUM、AVG、COUNT实战怎么答

来源:站长论坛作者:菲律宾程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《SQL聚合函数面试题常考什么?SUM、AVG、COUNT实战怎么答》,敬请观看详情。面试中被问到SUM、AVG、COUNT的区别时,不少人只答得出“求和、平均、计数”。其实考官更看重对NULL处理、与GROUP BY配合以及执行顺序的理解。比如COUNT(column)会忽略空值而COUNT(*)不会,AVG等价于SUM除以非null行数,在带WHERE和HAVING的查询里结果差异明显。本文用员工绩效表做演示,给出可运行语句和输出对照,说明三者在联表与分组场景下的真实行为,帮你避开把计数当去重、忽略浮点精度等常见失分点。

SQL聚合函数是数据分析与后台开发岗位笔试中的高频考点,其中SUM、AVG、COUNT三者既能单独使用,也常和GROUP BY、HAVING组合出现。理解它们的底层统计逻辑与边界情况,是通过面试的关键。

SQL聚合函数面试题常考什么?SUM、AVG、COUNT实战怎么答

一、COUNT的两种写法与NULL陷阱

COUNT在面试题中最容易挖坑的地方是“统计什么”。COUNT(*)统计所有行,无论字段是否为NULL;COUNT(列名)只统计该列非NULL的行。很多候选人误以为二者等价,在要求“统计有邮箱的员工数”时写了COUNT(*),导致结果偏大。

以下示例用员工表演示差异。表中第三行邮箱为NULL,业务上不应计入“有邮箱人数”。

-- 员工表 emp(id, name, email)
-- 数据:
-- 1, 张三, z@ipipp.com
-- 2, 李四, l@ipipp.com
-- 3, 王五, NULL

SELECT COUNT(*) AS total_row,
       COUNT(email) AS has_email
FROM emp;
-- 返回: total_row=3, has_email=2

另一个冷门点是COUNT(DISTINCT 列)可以去重计数。当面试问“每个部门有多少不同工种”时,必须用DISTINCT,否则会把同工种重复计算。它比先GROUP BY再COUNT(*)更简洁,但在超大数据集上 DISTINCT 排序开销更高,这是面试中谈优化时常说的权衡。

二、SUM与AVG的运算本质

AVG(col)在关系数据库里严格等于SUM(col)除以COUNT(col)(均忽略NULL),而不是除以总行数。这个定义决定了:如果一列有一半是NULL,AVG只会用另一半求和再除以非NULL行数,结果可能比直觉高。

看一个工资补贴场景,bonus列部分为空,直接算平均补贴容易误读。

-- emp(id, name, salary, bonus)
-- 1, 张三, 8000, 500
-- 2, 李四, 9000, NULL
-- 3, 王五, 7000, 300

SELECT SUM(bonus) AS sum_b,
       AVG(bonus) AS avg_b,
       SUM(bonus)/COUNT(bonus) AS calc_avg
FROM emp;
-- sum_b=800, avg_b=400, calc_avg=400

SUM对NULL的处理是“忽略”,不是当0。若用COALESCE(bonus,0)包一层再SUM,结果会变成800+0+300=1100,语义从“已发补贴总额”变成“应发补贴总额”,面试里必须根据需求选。AVG返回浮点,在金额报表中常配合ROUND(AVG(bonus),2)控制精度,避免浮点误差被展示出来。

三、GROUP BY与HAVING中的实战组合

聚合函数不能写在WHERE后面,这是语法错;过滤分组要用HAVING。下面按部门算平均薪资,并只保留平均大于7500的部门。

-- dept_emp(dept_id, name, salary)
SELECT dept_id,
       SUM(salary) AS dept_sum,
       AVG(salary) AS dept_avg,
       COUNT(*) AS emp_cnt
FROM dept_emp
GROUP BY dept_id
HAVING AVG(salary) > 7500;

执行顺序上,数据库先WHERE筛行,再GROUP BY分组,然后算聚合,最后HAVING滤组。面试常问“WHERE和HAVING区别”,核心就是“行级过滤”和“组级过滤”。若在HAVING里用COUNT(*) > 3,意思是组内人数超3才输出,这和先算再筛的逻辑完全一致。

联表时聚合更易出错。比如左联部门表后COUNT(emp.id)与COUNT(dept.id)不同:前者在没员工时得0,后者因部门本身存在而得1。写面试题时要在SELECT里明确列名,防止考官追问“你数的是哪边的行”。

四、常见面试题作答模板

当考官给出场景“统计各城市订单数、总金额、客单价”,标准答法是用GROUP BY city配合COUNT(order_id)、SUM(amount)、SUM(amount)/COUNT(order_id)。若补充“排除金额为空订单”,则在WHERE写amount IS NOT NULL,而不是在HAVING里再判。

最后提醒,聚合函数嵌套如AVG(SUM(x))非法,必须先GROUP BY出中间表再外层聚合;而窗口函数SUM() OVER()虽不分组却也属聚合类,面试进阶题常拿来对比GROUP BY的“折叠行”与“保留行”差异。把上述NULL、执行序、联表计数三点讲清,SUM、AVG、COUNT实战题基本能拿满分。

SQL聚合函数SUMCOUNT修改时间:2026-08-10 14:45:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。