SQL 中 HAVING 和 WHERE 子句的差异详解
在 SQL 中,HAVING
和 WHERE
关键字用于过滤数据,但作用不同。两者都用于条件选择,但其应用取决于 GROUP BY
子句的存在与否。
WHERE 子句
WHERE
子句在聚合操作之前执行,根据各个行的值选择特定行。例如,以下查询检索年龄大于 20 的所有学生姓名:
<code class="language-sql">SELECT Name FROM Students WHERE Age > 20;</code>
HAVING 子句
相反,HAVING
子句在应用聚合函数之后执行。它根据聚合值过滤行组,这在需要检查聚合结果的场景中非常有用。
例如,以下查询检索每个城市的平均学生年龄,然后过滤结果以仅显示平均年龄大于 25 的城市:
<code class="language-sql">SELECT City, AVG(Age) AS AvgAge FROM Students GROUP BY City HAVING AvgAge > 25;</code>
关键区别
HAVING
和 WHERE
的根本区别在于它们的执行时间。WHERE
在聚合之前过滤行,而 HAVING
在聚合之后过滤组。这意味着 HAVING
用于检查聚合值的条件,而 WHERE
用于检查单个行值的条件。
示例
考虑以下包含示例数据的表:
City | Age |
---|---|
Boston | 22 |
Boston | 25 |
New York | 28 |
New York | 30 |
Los Angeles | 23 |
Los Angeles | 29 |
使用 WHERE 的查询:
<code class="language-sql">SELECT City, COUNT(*) AS Count FROM Students WHERE Age > 25;</code>
输出:
City | Count |
---|---|
New York | 2 |
使用 HAVING 的查询:
<code class="language-sql">SELECT City, COUNT(*) AS Count FROM Students GROUP BY City HAVING COUNT(*) > 1;</code>
输出:
City | Count |
---|---|
Boston | 2 |
New York | 2 |
在此示例中,WHERE
子句检索年龄大于 25 的学生人数,而 HAVING
子句检索每个城市中学生人数超过 1 的城市。
以上是SQL 中的 WHERE 与 HAVING:何时使用每个子句?的详细内容。更多信息请关注PHP中文网其他相关文章!