首頁 > 資料庫 > mysql教程 > SQL HAVING 與 WHERE:何時使用每個子句進行資料過濾?

SQL HAVING 與 WHERE:何時使用每個子句進行資料過濾?

Linda Hamilton
發布: 2025-01-21 09:56:09
原創
984 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板