理解SQL查詢中的WHERE與HAVING子句
SQL開發者經常面臨區分WHERE和HAVING子句的挑戰。本文旨在闡明它們在SQL查詢中的不同用法。
何時使用WHERE
何時使用HAVING
範例:擁有最多專業的講師
為了說明這種區別,請考慮以下表格:
<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中文網其他相關文章!