马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、MySQL 的 HAVING 是干什么的?
1. 焦点定义
- HAVING:
- HAVING 是 SQL 中用于对分组后的结果举行筛选的关键字。
- 它通常与 GROUP BY 共同利用,用于过滤聚合函数(如 COUNT、SUM、AVG 等)的结果。
二、利用场景
1. 常见利用场景
- 分组统计后筛选:
- 在分组的基础上筛选符合条件的数据(如订单数目大于 1 的用户)。
- 业务分析:
- 统计并筛选出满意特定条件的分组数据(如贩卖额凌驾一定阈值的地域)。
- 异常检测:
- 检测分组后的异常数据(如某类商品的库存低于安全线)。
- 报表天生:
三、底层原理
1. HAVING 的工作机制
- 作用:
- 原理:
- 分组操作:
- 聚合计算:
- 条件筛选:
- 实行操持优化:
- MySQL 剖析查询并天生实行操持,选择最优的索引和扫描方式。
2. 具体步骤
- 剖析查询:
- MySQL 剖析 SQL 查询语句,辨认 SELECT、FROM、GROUP BY 和 HAVING 子句。
- 分组操作:
- 聚合计算:
- 条件筛选:
- 返回结果:
四、流程图与概念图
1. 流程图
- 开始
- ↓
- 解析 SQL 查询
- ↓
- 分组数据(GROUP BY)
- ↓
- 聚合计算(COUNT/SUM/AVG)
- ↓
- 条件筛选(HAVING)
- ↓
- 返回结果
- ↓
- 结束
复制代码 2. 概念图
- +-------------------+
- | 数据表 |
- +-------------------+
- ↓
- +-------------------+
- | 分组操作 |
- +-------------------+
- ↓
- +-------------------+
- | 聚合计算 |
- +-------------------+
- ↓
- +-------------------+
- | 条件筛选 |
- +-------------------+
- ↓
- +-------------------+
- | 结果返回 |
- +-------------------+
复制代码 3. UML 类图
- +-----------------------+
- | GroupedQueryHandler |
- +-----------------------+
- | + filterWithHaving() |
- +-----------------------+
复制代码 4. 头脑导图
- MySQL HAVING
- ├── 使用场景
- │ ├── 分组统计后筛选
- │ ├── 业务分析
- │ ├── 异常检测
- │ └── 报表生成
- ├── 底层原理
- │ ├── 分组操作
- │ ├── 聚合计算
- │ ├── 条件筛选
- │ └── 执行计划优化
- └── 具体步骤
- ├── 解析查询
- ├── 分组操作
- ├── 聚合计算
- ├── 条件筛选
- └── 返回结果
复制代码 五、具体的完整 MySQL 实例代码
以下是一个完整的 MySQL 示例代码,展示怎样利用 HAVING 举行分组筛选。
1. 创建示例表
- -- 创建订单表
- CREATE TABLE orders (
- order_id INT PRIMARY KEY AUTO_INCREMENT,
- user_id INT, -- 用户 ID
- amount DECIMAL(10, 2), -- 订单金额
- order_date DATE -- 订单日期
- );
- -- 插入测试数据
- INSERT INTO orders (user_id, amount, order_date) VALUES
- (1, 100.00, '2023-10-01'),
- (1, 200.00, '2023-10-02'),
- (2, 150.00, '2023-10-01'),
- (3, 300.00, '2023-10-01'),
- (3, 250.00, '2023-10-03'),
- (3, 400.00, '2023-10-05');
复制代码 注释:
- orders 表包含订单 ID、用户 ID、订单金额和订单日期。
- 插入了多个用户的订单数据,其中部分用户有多条订单记录。
2. 利用 HAVING 查询
- -- 查询总订单金额大于 500 的用户
- SELECT
- user_id, -- 用户 ID
- SUM(amount) AS total_amount -- 统计总订单金额
- FROM
- orders -- 数据来源表
- GROUP BY
- user_id -- 按用户 ID 分组
- HAVING
- 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. 底层原理总结
3. 留意事项
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |