SQLite HAVING 子句
                           
天天向上
发布: 2025-03-04 08:45:09

原创
346 人浏览过

HAVING 子句用于在 SQL 查询中对 GROUP BY 产生的分组结果进行筛选。它类似于 WHERE 子句,但不同的是,WHERE 仅在分组前筛选原始数据,而 HAVING 在分组后对聚合结果进行筛选。通常,HAVING 用于与聚合函数一起使用。

基本语法

SELECT column_name(s), aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING aggregate_function(column_name) condition;
  • column_name(s): 用于选择的列。
  • aggregate_function: 聚合函数(例如 COUNT(), SUM(), AVG(), MAX(), MIN())。
  • table_name: 查询的数据表。
  • condition: 可选的查询条件。
  • HAVING aggregate_function(column_name) condition: 根据聚合结果进行筛选。

1. 使用 HAVING 过滤聚合结果

HAVING 常与聚合函数结合使用,可以在分组后对聚合数据进行过滤。

示例:

  • department 列分组,计算每个部门的总薪资,并仅返回总薪资大于 5000 的部门:
  SELECT department, SUM(salary)
  FROM employees
  GROUP BY department
  HAVING SUM(salary) > 5000;
  • 该查询返回总薪资大于 5000 的部门及其总薪资。

2. 使用 HAVING 和多个聚合条件

你可以在 HAVING 子句中设置多个条件,来对聚合结果进行更精确的筛选。

示例:

  • department 列分组,计算每个部门的平均薪资,要求平均薪资大于 5000 且员工人数大于 10:
  SELECT department, AVG(salary), COUNT(*)
  FROM employees
  GROUP BY department
  HAVING AVG(salary) > 5000 AND COUNT(*) > 10;
  • 该查询返回平均薪资大于 5000 且员工人数大于 10 的部门。

3. HAVINGWHERE 的区别

  • WHERE: 用于筛选原始数据,通常在 GROUP BY 之前使用。
  • HAVING: 用于筛选 GROUP BY 产生的分组数据,通常在分组后使用。

注意WHERE 不能直接与聚合函数一起使用,而 HAVING 可以。

示例:

  • 先筛选出薪资大于 3000 的员工,再按 department 分组,计算每个部门的平均薪资,最后筛选出平均薪资大于 5000 的部门:
  SELECT department, AVG(salary)
  FROM employees
  WHERE salary > 3000
  GROUP BY department
  HAVING AVG(salary) > 5000;
  • 该查询首先筛选薪资大于 3000 的员工,然后对这些员工按部门分组并计算平均薪资,最后返回平均薪资大于 5000 的部门。

4. HAVINGGROUP BY 结合使用

通常,HAVINGGROUP BY 一起使用,用于对分组后的结果进行进一步筛选。你可以在 GROUP BY 后应用聚合条件。

示例:

  • department 列分组,计算每个部门的员工人数,并返回员工人数大于 5 的部门:
  SELECT department, COUNT(*)
  FROM employees
  GROUP BY department
  HAVING COUNT(*) > 5;
  • 该查询返回员工人数大于 5 的部门。

5. 使用 HAVING 进行排序后的筛选

有时你可能希望对分组后的结果进行排序,并基于排序结果进一步筛选。

示例:

  • department 列分组,计算每个部门的总薪资,按总薪资降序排列,并只返回前 3 个部门:
  SELECT department, SUM(salary)
  FROM employees
  GROUP BY department
  HAVING SUM(salary) > 10000
  ORDER BY SUM(salary) DESC
  LIMIT 3;
  • 该查询返回总薪资大于 10000 的前 3 个部门。

总结

  • HAVING 子句用于筛选 GROUP BY 产生的分组结果,通常与聚合函数一起使用。
  • WHERE 用于筛选原始数据,HAVING 用于筛选聚合后的数据。
  • 可以在 HAVING 中使用多个条件来进一步筛选分组后的结果。
  • HAVING 可以与 GROUP BY、聚合函数和排序功能一起使用,灵活控制查询结果。

HAVING 是进行聚合数据筛选时非常重要的工具,特别是在生成报告和进行数据分析时。更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *