首页 >数据库 >mysql教程 >SQL 中的 HAVING 与 WHERE:何时应该使用每个子句进行聚合?

SQL 中的 HAVING 与 WHERE:何时应该使用每个子句进行聚合?

Barbara Streisand
Barbara Streisand原创
2025-01-21 09:53:09348浏览

HAVING vs. WHERE in SQL: When Should I Use Each Clause for Aggregation?

SQL 聚合查询中 HAVING 和 WHERE 子句的差异

在处理聚合数据时,理解 HAVING 和 WHERE 子句之间的区别至关重要。本文将深入探讨一个常见的查询场景,并解释为什么一种方法能返回正确的结果,而另一种方法不能。

查询上下文

给定以下表格:

  • Lecturers(列:LectID、Fname、Lname、degree)
  • Lecturers_Specialization(列:LectID、Expertise)

目标是找到拥有最多专业的讲师。

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn