目录

  1. SQL HAVING 子句简介
  2. SQL HAVING 子句的语法
  3. SQL HAVING 子句的使用示例
  4. 注意事项
  5. 参考资料

SQL HAVING 子句简介

HAVING 子句用于在 GROUP BY 子句分组之后对分组进行筛选。它与 WHERE 子句类似,但有一个重要的区别:WHERE 子句用于筛选行数据,而 HAVING 子句则用于筛选已经分组后的结果。HAVING 子句通常与聚合函数(如 COUNT()SUM()AVG() 等)一起使用,以对分组后的数据进行条件筛选。

HAVING 子句必须在 GROUP BY 之后使用,它可以用于过滤聚合结果。


SQL HAVING 子句的语法

SELECT column1, column2, ..., aggregation_function(column)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition;

参数说明:

  • column1, column2, …:要查询的列,可以是原始列名或聚合函数。
  • aggregation_function(column):聚合函数,如 COUNT()SUM()AVG()MAX()MIN(),应用于要汇总的列。
  • table_name:查询的数据表名称。
  • WHERE condition:可选,用于筛选行数据。
  • GROUP BY column1, column2, …:用于指定如何对数据进行分组。
  • HAVING condition:用于对分组后的结果进行条件筛选。

返回值:

  • 返回符合 HAVING 子句中条件的分组数据。

SQL HAVING 子句的使用示例

示例 1:获取工资大于 5000 的部门

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 5000;

该查询将返回所有工资总和大于 5000 的部门。

示例 2:获取每个部门中员工人数大于 5 的部门

SELECT department, COUNT(*) AS total_employees
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

该查询将返回员工人数大于 5 的部门。

示例 3:获取销售总额超过 10000 的产品类别

SELECT category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category
HAVING SUM(sales_amount) > 10000;

该查询将返回销售总额超过 10000 的产品类别。

示例 4:获取每个客户的订单总额大于 500 的客户

SELECT customer_id, SUM(order_amount) AS total_order_amount
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) > 500;

该查询将返回每个客户的订单总额大于 500 的客户。


注意事项

  1. HAVINGWHERE 的区别
    • WHERE 用于筛选行数据,它在 GROUP BY 之前执行,不能与聚合函数一起使用。
    • HAVING 用于筛选分组后的数据,它在 GROUP BY 之后执行,可以与聚合函数一起使用。
  2. 性能问题
    • 由于 HAVING 子句是在分组之后进行过滤,因此可能会影响查询的性能,尤其是在处理大量数据时。如果可以使用 WHERE 子句筛选数据,尽量避免使用 HAVING 来提高性能。
  3. 组合使用 HAVING 和聚合函数
    • HAVING 子句常常与聚合函数(如 COUNT()SUM()AVG() 等)一起使用,用于筛选基于聚合结果的数据。

参考资料