SQL 資料過濾:WHERE 與 HAVING 子句的差異
SQL 中的 HAVING 和 WHERE 子句都用於過濾數據,但它們的功能有所不同。 WHERE 子句作用於單一行,而 HAVING 子句作用於聚合結果。
差異範例
假設我們有兩個表格:Lecturers
和 Lecturers_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中文網其他相關文章!