SQL 教程 目录

SQL HAVING 子句筛选分组

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 功能结合使用,可以帮助你构建出更加灵活和强大的查询语句。在实际工作中,合理运用这些知识能够帮助你有效地处理复杂的数据分析需求。

纠错
反馈