SQL 数据过滤:WHERE 和 HAVING 子句的差异
SQL 中的 HAVING 和 WHERE 子句都用于过滤数据,但它们的功能有所不同。WHERE 子句作用于单个行,而 HAVING 子句作用于聚合结果。
差异示例
假设我们有两个表:Lecturers
和 Lecturers_Specialization
,我们希望找出拥有最多专业领域的讲师。
使用 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 子句过滤的是单个行,而 COUNT(S.Expertise) >= ALL
比较不能应用于单个行。
正确的查询使用 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 子句作用于聚合结果,确保比较应用于每个讲师的专业领域数量。
经验法则和优化
一般来说,WHERE 子句在 GROUP BY 子句之前使用,用于过滤单个行;HAVING 子句在 GROUP BY 子句之后使用,用于过滤聚合结果。
此外,可以使用 ANSI JOIN 语法代替 L, S θ 连接语法来优化查询:
<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>
以上是SQL HAVING 与 WHERE:何时使用每个子句进行数据过滤?的详细内容。更多信息请关注PHP中文网其他相关文章!