SQL 聚合查询中 HAVING 和 WHERE 子句的差异
在处理聚合数据时,理解 HAVING 和 WHERE 子句之间的区别至关重要。本文将深入探讨一个常见的查询场景,并解释为什么一种方法能返回正确的结果,而另一种方法不能。
查询上下文
给定以下表格:
目标是找到拥有最多专业的讲师。
使用 WHERE 子句的失败尝试
失败的查询尝试使用 WHERE 子句根据专业数量过滤结果:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
此查询未能产生预期结果,因为 WHERE 子句不适合用于对聚合值应用条件。
使用 HAVING 子句的成功查询
成功的查询改为使用 HAVING 子句:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
HAVING 成功的原因
HAVING 子句专门用于过滤聚合查询的结果。它在 GROUP BY 操作之后应用条件,允许我们检查每个讲师的专业数量。
经验法则
一般来说,在 GROUP BY 之前使用 WHERE 过滤单个行,在 GROUP BY 之后使用 HAVING 过滤聚合结果。
使用 ANSI JOIN 的改进查询
还提供了一个使用 ANSI JOIN 语法的替代查询版本:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>
此版本消除了 WHERE 用于连接条件的使用,并改用 JOIN。
以上是SQL 中的 HAVING 与 WHERE:何时应该使用每个子句进行聚合?的详细内容。更多信息请关注PHP中文网其他相关文章!