跳至內容

Having

維基百科,自由的百科全書

SQL中的HAVING子句規定:SELECT語句僅返回聚合值(aggregate values)滿足指定條件的行。[1]: 125–127 

用法

[編輯]

初學者經常混淆HAVINGWHERE,但它們的作用階段完全不同。WHERE在查詢執行的早期階段生效,用於過濾從表中讀取的原始行。如果查詢包含GROUP BY,系統會先對讀取的行進行分組和聚合計算。在聚合操作之後,系統才會應用HAVING,過濾掉那些不符合指定條件的聚合行。因此,WHERE作用於從表中讀取的數據,而HAVING僅應作用於聚合後的數據——因為在查詢的初始階段,這些聚合值(如總和、平均值)還是未知的。為了查看由GROUP BY子句生成的當前狀態(Condition),通常會使用HAVING子句。

示例

[編輯]

若要查詢2000年1月1日當天總銷售額超過1000美元的部門ID列表及其銷售額總和:

SELECT DeptID, SUM(SaleAmount)
FROM Sales
WHERE SaleDate = '2000-01-01'
GROUP BY DeptID
HAVING SUM(SaleAmount) > 1000

以下查詢將返回員工的人數超過1人的部門列表:

SELECT DepartmentName, COUNT(*) 
FROM Employee
JOIN Department ON Employee.DepartmentID = Department.DepartmentID 
GROUP BY DepartmentName
HAVING COUNT(*) > 1;

使用HAVING非常方便,但並非必不可少。如果不用HAVING,實現上述示例等效功能的代碼可能如下所示:

SELECT * FROM (
    SELECT DepartmentName AS deptNam, COUNT(*) AS empCount
    FROM Employee AS emp
    JOIN Department AS dept ON emp.DepartmentID = dept.DepartmentID
    GROUP BY deptNam
) AS grp
WHERE grp.empCount > 1;

參考文獻

[編輯]
  1. ^ PostgreSQL 16.1 Documentation (PDF). The PostgreSQL Global Development Group. 2023 [2024-02-08]. (原始內容存檔 (PDF)於2026-03-11). 

外部連結

[編輯]