MySQL的HAVING到底是干什么的?利用场景是什么?底层原理是什么? ...

打印 上一主题 下一主题

主题 1394|帖子 1394|积分 4197

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、MySQL 的 HAVING 是干什么的?

1. 焦点定义



  • HAVING

    • HAVING 是 SQL 中用于对分组后的结果举行筛选的关键字。
    • 它通常与 GROUP BY 共同利用,用于过滤聚合函数(如 COUNT、SUM、AVG 等)的结果。


二、利用场景

1. 常见利用场景



  • 分组统计后筛选

    • 在分组的基础上筛选符合条件的数据(如订单数目大于 1 的用户)。

  • 业务分析

    • 统计并筛选出满意特定条件的分组数据(如贩卖额凌驾一定阈值的地域)。

  • 异常检测

    • 检测分组后的异常数据(如某类商品的库存低于安全线)。

  • 报表天生

    • 天生符合特定条件的汇总数据。


三、底层原理

1. HAVING 的工作机制



  • 作用

    • 提供一种灵活的方式对分组后的结果举行筛选。

  • 原理

    • 分组操作

      • 利用 GROUP BY 将数据按指定字段分组。

    • 聚合计算

      • 对每组应用聚合函数(如 COUNT、SUM)。

    • 条件筛选

      • 利用 HAVING 筛选分组后的结果。

    • 实行操持优化

      • MySQL 剖析查询并天生实行操持,选择最优的索引和扫描方式。



2. 具体步骤


  • 剖析查询

    • MySQL 剖析 SQL 查询语句,辨认 SELECT、FROM、GROUP BY 和 HAVING 子句。

  • 分组操作

    • 根据 GROUP BY 字段对数据举行分组。

  • 聚合计算

    • 对每个分组应用聚合函数(如 COUNT(*))。

  • 条件筛选

    • 利用 HAVING 筛选出符合条件的分组。

  • 返回结果

    • 返回筛选后的结果集。


四、流程图与概念图

1. 流程图

  1. 开始
  2.   ↓
  3. 解析 SQL 查询
  4.   ↓
  5. 分组数据(GROUP BY)
  6.   ↓
  7. 聚合计算(COUNT/SUM/AVG)
  8.   ↓
  9. 条件筛选(HAVING)
  10.   ↓
  11. 返回结果
  12.   ↓
  13. 结束
复制代码
2. 概念图

  1. +-------------------+
  2. | 数据表            |
  3. +-------------------+
  4.         ↓
  5. +-------------------+
  6. | 分组操作          |
  7. +-------------------+
  8.         ↓
  9. +-------------------+
  10. | 聚合计算          |
  11. +-------------------+
  12.         ↓
  13. +-------------------+
  14. | 条件筛选          |
  15. +-------------------+
  16.         ↓
  17. +-------------------+
  18. | 结果返回          |
  19. +-------------------+
复制代码
3. UML 类图

  1. +-----------------------+
  2. | GroupedQueryHandler   |
  3. +-----------------------+
  4. | + filterWithHaving()  |
  5. +-----------------------+
复制代码
4. 头脑导图

  1. MySQL HAVING
  2. ├── 使用场景
  3. │   ├── 分组统计后筛选
  4. │   ├── 业务分析
  5. │   ├── 异常检测
  6. │   └── 报表生成
  7. ├── 底层原理
  8. │   ├── 分组操作
  9. │   ├── 聚合计算
  10. │   ├── 条件筛选
  11. │   └── 执行计划优化
  12. └── 具体步骤
  13.     ├── 解析查询
  14.     ├── 分组操作
  15.     ├── 聚合计算
  16.     ├── 条件筛选
  17.     └── 返回结果
复制代码

五、具体的完整 MySQL 实例代码

以下是一个完整的 MySQL 示例代码,展示怎样利用 HAVING 举行分组筛选。
1. 创建示例表

  1. -- 创建订单表
  2. CREATE TABLE orders (
  3.     order_id INT PRIMARY KEY AUTO_INCREMENT,
  4.     user_id INT, -- 用户 ID
  5.     amount DECIMAL(10, 2), -- 订单金额
  6.     order_date DATE -- 订单日期
  7. );
  8. -- 插入测试数据
  9. INSERT INTO orders (user_id, amount, order_date) VALUES
  10. (1, 100.00, '2023-10-01'),
  11. (1, 200.00, '2023-10-02'),
  12. (2, 150.00, '2023-10-01'),
  13. (3, 300.00, '2023-10-01'),
  14. (3, 250.00, '2023-10-03'),
  15. (3, 400.00, '2023-10-05');
复制代码
注释


  • orders 表包含订单 ID、用户 ID、订单金额和订单日期。
  • 插入了多个用户的订单数据,其中部分用户有多条订单记录。

2. 利用 HAVING 查询

  1. -- 查询总订单金额大于 500 的用户
  2. SELECT
  3.     user_id, -- 用户 ID
  4.     SUM(amount) AS total_amount -- 统计总订单金额
  5. FROM
  6.     orders -- 数据来源表
  7. GROUP BY
  8.     user_id -- 按用户 ID 分组
  9. HAVING
  10.     SUM(amount) > 500; -- 筛选总订单金额大于 500 的用户
复制代码
注释


  • GROUP BY user_id:将数据按 user_id 分组。
  • SUM(amount):统计每组的订单总金额。
  • HAVING SUM(amount) > 500:筛选总订单金额大于 500 的用户。

3. 查询结果

假设插入的数据如下:
order_iduser_idamountorder_date11100.002023-10-0121200.002023-10-0232150.002023-10-0143300.002023-10-0153250.002023-10-0363400.002023-10-05 实行查询后,结果如下:
user_idtotal_amount3950.00 注释


  • 用户 3 的总订单金额为 950.00,满意条件。
  • 用户 1 和用户 2 的总订单金额分别为 300.00 和 150.00,不满意条件。

六、总结

1. 为什么需要 HAVING?



  • 分组统计后筛选

    • 在分组的基础上筛选符合条件的数据。

  • 业务分析

    • 统计并筛选出满意特定条件的分组数据。

  • 异常检测

    • 检测分组后的异常数据。

  • 报表天生

    • 提供统计数据以支持决议。

2. 底层原理总结



  • 分组操作

    • 利用 GROUP BY 将数据按指定字段分组。

  • 聚合计算

    • 对每组应用聚合函数(如 SUM、COUNT)。

  • 条件筛选

    • 利用 HAVING 筛选分组后的结果。

3. 留意事项



  • 性能优化

    • 确保分组字段上有适当的索引,避免全表扫描。

  • 数据量

    • 对于大数据量的表,需留意查询性能。

  • 可读性

    • 利用清晰的字段名和注释提高代码可读性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表