Having
外觀
SQL中的HAVING子句規定:SELECT語句僅返回聚合值(aggregate values)滿足指定條件的行。[1]: 125–127
用法
[編輯]初學者經常混淆HAVING和WHERE,但它們的作用階段完全不同。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;
參考文獻
[編輯]- ^ PostgreSQL 16.1 Documentation (PDF). The PostgreSQL Global Development Group. 2023 [2024-02-08]. (原始內容存檔 (PDF)於2026-03-11).
外部連結
[編輯]- The HAVING and GROUP BY SQL clauses 互聯網檔案館的存檔,存檔日期2011-06-03.
- SQL Aggregate Functions 互聯網檔案館的存檔,存檔日期May 3, 2017,.