SQL 中不能轻视的 HAVING 子句

06-01 1134阅读

        SQL 是一种强大的数据库查询语言,它允许我们在大量数据中搜索、计算和汇总信息。在查询中,对数据进行过滤是常见的需求,当我们在过滤时,常用 WHERE 和 HAVING。这两者的区别看似简单,但在实际应用中并不容易分清。

        在本文中,我们将深入解析 HAVING 的功能,了解它的用法,以及它和 WHERE 子句的区别。通过许多实际案例,我们将完整地分析 HAVING 在 SQL 中的实际应用。

目录

HAVING 子句概述

1. HAVING 的基本语法

2. WHERE 和 HAVING 的区别

HAVING 子句的应用实例

案例 1:计算每个部门的员工数,并筛选员工数大于 3 的部门

案例 2:筛选平均薪资高于 5000 的部门

案例 3:同时使用 WHERE 和 HAVING

HAVING 子句的高级用法

1. 使用多重条件筛选

2. 使用 HAVING 进行范围筛选

3. 结合 ORDER BY 进行排序

HAVING 子句的优化策略

SQL 中不能轻视的 HAVING 子句
(图片来源网络,侵删)

总结


HAVING 子句概述

HAVING 子句专门用于 对聚合数据进行过滤,即它用于 GROUP BY 语句的结果集。在执行 SQL 查询时,我们通常先用 WHERE 过滤原始数据,然后用 HAVING 对分组后的数据进行进一步筛选。

SQL 中不能轻视的 HAVING 子句
(图片来源网络,侵删)

1. HAVING 的基本语法

SELECT 列名, 聚合函数
FROM 表名
GROUP BY 列名
HAVING 条件;

2. WHERE 和 HAVING 的区别

对比项WHERE 子句HAVING 子句
作用范围作用于 单行数据作用于 聚合后的数据
作用对象普通列聚合函数 (SUM、AVG、COUNT 等)
使用场景过滤原始数据过滤聚合后的数据
语法位置在 GROUP BY 之前在 GROUP BY 之后
计算影响影响分组前的数据集大小影响分组后的数据集大小

在 SQL 查询优化中,推荐 尽可能使用 WHERE 进行初步筛选,以减少 GROUP BY 需要处理的数据量,从而提升查询效率。


HAVING 子句的应用实例

案例 1:计算每个部门的员工数,并筛选员工数大于 3 的部门

SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 3;

📌 解析:

SQL 中不能轻视的 HAVING 子句
(图片来源网络,侵删)
  • GROUP BY department 按部门分组。

  • COUNT(*) 计算每个部门的员工数量。

  • HAVING COUNT(*) > 3 只保留 员工数量大于 3 的部门。

    案例 2:筛选平均薪资高于 5000 的部门

    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 5000;

    📌 解析:

    • 计算 department 组内的平均薪资。

    • HAVING 过滤掉 平均薪资低于 5000 的部门。

      案例 3:同时使用 WHERE 和 HAVING

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

      📌 解析:

      • WHERE salary > 3000 先筛选 工资高于 3000 的员工。

      • GROUP BY department 按部门分组。

      • HAVING SUM(salary) > 20000 只保留 薪资总和大于 20000 的部门。


        HAVING 子句的高级用法

        1. 使用多重条件筛选

        SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary
        FROM employees
        GROUP BY department
        HAVING COUNT(*) > 5 AND AVG(salary) > 6000;

        📌 解析:

        • HAVING 支持逻辑运算符 AND、OR 组合多个条件。

        • 过滤掉 员工数少于 5 或者平均薪资低于 6000 的部门。

          2. 使用 HAVING 进行范围筛选

          SELECT department, SUM(salary) AS total_salary
          FROM employees
          GROUP BY department
          HAVING SUM(salary) BETWEEN 10000 AND 50000;

          📌 解析:

          • HAVING SUM(salary) BETWEEN 10000 AND 50000 过滤 薪资总和在 10000 到 50000 之间的部门。

            3. 结合 ORDER BY 进行排序

            SELECT department, COUNT(*) AS emp_count
            FROM employees
            GROUP BY department
            HAVING COUNT(*) > 3
            ORDER BY COUNT(*) DESC;

            📌 解析:

            • ORDER BY COUNT(*) DESC 按 员工数降序排列,以便快速查看最大部门。


              HAVING 子句的优化策略

              1. 尽量使用 WHERE 进行初步筛选,减少数据规模,提高 GROUP BY 计算效率。

              2. 避免在 HAVING 语句中进行复杂计算,可以将计算结果存入临时表,提高查询性能。

              3. 使用索引优化分组字段,如果 GROUP BY 作用在大表的字段上,可以考虑创建索引,以提升查询速度。


              总结

              • HAVING 主要用于 对聚合结果进行筛选,而 WHERE 用于 单行数据的筛选。

              • 在 SQL 查询优化时,推荐 优先使用 WHERE 过滤原始数据,然后在 HAVING 里进行聚合数据筛选。

              • HAVING 适用于 COUNT、SUM、AVG、MAX、MIN 等聚合函数的筛选,配合 ORDER BY 可以更方便地分析数据。

                通过合理使用 HAVING,可以有效优化 SQL 查询,提高数据库操作的效率。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码