SQL 聚合查詢中 HAVING 與 WHERE 子句的差異
在處理聚合資料時,理解 HAVING 和 WHERE 子句之間的區別至關重要。本文將深入探討一個常見的查詢場景,並解釋為什麼一種方法能回傳正確的結果,而另一種方法則不能。
查詢上下文
給定以下表格:
目標是找到擁有最多專業的講師。
使用 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中文網其他相關文章!