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

SQL 中的 WHERE 与 HAVING:我应该何时使用每个子句?

DDD
DDD原创
2025-01-21 09:36:39205浏览

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

理解SQL查询中的WHERE和HAVING子句

SQL开发者经常面临区分WHERE和HAVING子句的挑战。本文旨在阐明它们在SQL查询中的不同用法。

何时使用WHERE

  • 过滤单个行: WHERE子句用于对表中或连接结果集中的单个行施加条件。它评估每一行,只选择满足指定条件的行。

何时使用HAVING

  • 过滤聚合结果: HAVING子句将条件应用于由聚合函数(例如COUNT()、SUM()、AVG())表示的行组。当需要在聚合操作后对汇总数据设置条件时使用它。

示例:拥有最多专业的讲师

为了说明这种区别,考虑以下表格:

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

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