理解SQL查询中的WHERE和HAVING子句
SQL开发者经常面临区分WHERE和HAVING子句的挑战。本文旨在阐明它们在SQL查询中的不同用法。
何时使用WHERE
何时使用HAVING
示例:拥有最多专业的讲师
为了说明这种区别,考虑以下表格:
<code>1. Lecturers (LectID, Fname, Lname, degree) 2. Lecturers_Specialization (LectID, Expertise)</code>
目标是找出拥有最多专业的讲师。
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查询不起作用,因为它试图使用WHERE根据聚合函数(COUNT(S.Expertise))进行过滤。WHERE子句用于过滤单个行,而不是聚合结果。
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查询成功检索到正确的结果,因为它在GROUP BY操作之后对聚合数据(COUNT(S.Expertise))设置条件。
ANSI连接版本(推荐)
使用ANSI连接语法,查询可以改写为:
<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子句,从而得到更高效且符合标准的查询。
以上是SQL 中的 WHERE 与 HAVING:我应该何时使用每个子句?的详细内容。更多信息请关注PHP中文网其他相关文章!