SQL HAVING 子句筛选分组

· 约 4 分钟读完 · 第 74 / 87 章

HAVING 子句是 SQL 中的一个重要概念,用于在聚合函数完成其计算后对结果进行过滤。HAVING 子句通常与 GROUP BY 子句一起使用,以限制分组后的输出。在本章中,我们将深入探讨 HAVING 子句的用法、应用场景以及如何结合 GROUP BY 子句进行有效查询。

HAVING 子句的基本用法

HAVING 子句允许我们根据聚合函数的结果来过滤记录。它通常出现在 GROUP BY 子句之后,并且可以被视为一个“过滤器”,只允许那些满足特定条件的分组通过。

示例

假设我们有一个名为 orders 的表,其中包含订单信息。我们想要找出那些总金额超过1000元的客户。

在这个例子中,我们首先按 customer_id 分组,然后使用 SUM() 函数计算每个客户的总订单金额。最后,HAVING 子句确保只有那些总金额超过1000元的客户被选中。

HAVING 子句与 WHERE 子句的区别

HAVING 子句和 WHERE 子句都用于过滤数据,但它们的作用对象不同:

  • WHERE 子句:在分组之前应用,用于过滤单个行的数据。
  • HAVING 子句:在分组之后应用,用于过滤分组后的数据。

示例对比

假设有如下 employees 表:

id name department
1 Alice Sales
2 Bob Sales
3 Carol Marketing
4 David Marketing

使用 WHERE 子句

如果我们只想选择部门为 Sales 的员工:

使用 HAVING 子句

如果我们想要计算每个部门的平均工资,并且只显示那些平均工资超过5000的部门:

结合其他 SQL 功能使用 HAVING

HAVING 子句可以与其他 SQL 功能(如子查询、连接等)结合使用,以创建更复杂的查询。

使用子查询

假设我们有一个 departments 表,我们可以先通过子查询获取平均工资最高的部门,然后在主查询中使用 HAVING 来过滤这些部门:

使用 JOIN

假设我们有另一个 department_budgets 表,我们可以结合 HAVING 子句来找出那些实际支出超过预算的部门:

总结

通过本章的学习,你应该已经掌握了 HAVING 子句的基本用法及其与 WHERE 子句的主要区别。了解如何将 HAVING 子句与其他 SQL 功能结合使用,可以帮助你构建出更加灵活和强大的查询语句。在实际工作中,合理运用这些知识能够帮助你有效地处理复杂的数据分析需求。