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,.