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

SQL 中的 WHERE 與 HAVING:我應該何時使用每個子句?

DDD
DDD原創
2025-01-21 09:36:39206瀏覽

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

理解SQL查詢中的WHERE與HAVING子句

SQL開發者經常面臨區分WHERE和HAVING子句的挑戰。本文旨在闡明它們在SQL查詢中的不同用法。

何時使用WHERE

  • 過濾單一行: WHERE子句用於對資料表中或連接結果集中的單一行施加條件。它評估每一行,只選擇滿足指定條件的行。

何時使用HAVING

  • 過濾聚合結果: HAVING子句將條件應用於由聚合函數(例如COUNT()、SUM()、AVG())表示的行組。當需要在聚合操作後對匯總資料設定條件時使用它。

範例:擁有最多專業的講師

為了說明這種區別,請考慮以下表格:

<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中文網其他相關文章!

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