首頁 >資料庫 >mysql教程 >SQL 中的 HAVING 與 WHERE:何時應該使用每個子句進行聚合?

SQL 中的 HAVING 與 WHERE:何時應該使用每個子句進行聚合?

Barbara Streisand
Barbara Streisand原創
2025-01-21 09:53:09348瀏覽

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

SQL 聚合查詢中 HAVING 與 WHERE 子句的差異

在處理聚合資料時,理解 HAVING 和 WHERE 子句之間的區​​別至關重要。本文將深入探討一個常見的查詢場景,並解釋為什麼一種方法能回傳正確的結果,而另一種方法則不能。

查詢上下文

給定以下表格:

  • Lecturers(列:LectID、Fname、Lname、degree)
  • Lecturers_Specialization(欄位:LectID、Expertise)

目標是找到擁有最多專業的講師。

使用 WHERE 子句的失敗嘗試

失敗的查詢嘗試使用 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 子句不適合用於對聚合值套用條件。

使用 HAVING 子句的成功查詢

成功的查詢改為使用 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 成功的原因

HAVING 子句專門用來過濾聚合查詢的結果。它在 GROUP BY 操作之後應用條件,允許我們檢查每個講師的專業數量。

經驗法則

一般來說,在 GROUP BY 之前使用 WHERE 過濾單一行,在 GROUP BY 之後使用 HAVING 過濾聚合結果。

使用 ANSI JOIN 的改良查詢

也提供了一個使用 ANSI JOIN 語法的替代查詢版本:

<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 用於連接條件的使用,並改用 JOIN。

以上是SQL 中的 HAVING 與 WHERE:何時應該使用每個子句進行聚合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn