首页 > 数据库 > mysql教程 > SQL HAVING 与 WHERE:何时使用每个子句进行数据过滤?

SQL HAVING 与 WHERE:何时使用每个子句进行数据过滤?

Linda Hamilton
发布: 2025-01-21 09:56:09
原创
948 人浏览过

SQL HAVING vs. WHERE: When to Use Each Clause for Data Filtering?

SQL 数据过滤:WHERE 和 HAVING 子句的差异

SQL 中的 HAVING 和 WHERE 子句都用于过滤数据,但它们的功能有所不同。WHERE 子句作用于单个行,而 HAVING 子句作用于聚合结果。

差异示例

假设我们有两个表:LecturersLecturers_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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板