跳转到内容

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

外部链接

[编辑]