在编写 SQL 查询时,数据过滤是常见需求。WHERE 和 HAVING 子句虽然都用于筛选数据,但实际用法大不雷同。本文通过详细示例对比两者的核心区别,并结合实际场景演示连合利用本领,助力快速掌握这两个关键工具的正确用法。
一、数据表结构
假设存在 sales 表,其结构如下:
sale_idproduct_idsale_datesale_amount11012024-01-0110021012024-01-0220031022024-01-0315041032024-01-0430051032024-01-05250 二、WHERE 子句
(一)功能
用于过滤行数据,直接作用于表中的单行数据,在分组操纵之前应用。
(二)特点
不能利用聚合函数。
假设尝试在 WHERE 中利用聚合函数:
- SELECT product_id, SUM(sale_amount) AS total_sales
- FROM sales
- WHERE SUM(sale_amount) > 150; -- ❌ 错误:WHERE 无法使用聚合函数
复制代码 错误原因:
执行 WHERE 时,尚未对 sale_amount 进行求和盘算,因此 SUM(sale_amount) 不存在。
(三)准确示例
假设要找出 sale_amount 大于 150 的贩卖记载。
- SELECT *
- FROM sales
- WHERE sale_amount > 150;
复制代码 结果:
sale_idproduct_idsale_datesale_amount21012024-01-0220041032024-01-0430051032024-01-05250 三、HAVING 子句
(一)功能
用于过滤分组后的结果集,作用于分组后的数据,在分组操纵之后应用。
(二)特点
可以利用聚合函数(如 SUM()、AVG()、COUNT() 等)来定义过滤条件。
(三)详细示例
假设要找出贩卖总额超过 400 的产物。
- SELECT product_id, SUM(sale_amount) AS total_sales
- FROM sales
- GROUP BY product_id
- HAVING SUM(sale_amount) > 400;
复制代码 结果:
product_idtotal_sales103550 四、WHERE 和 HAVING 结合利用
(一)利用场景
当需要先对行数据进行过滤,再对分组结果进行过滤时,可结合利用 WHERE 和 HAVING 子句。
(二)示例
假设要找出贩卖总额超过 400 的产物,并且只考虑在 2024 年 1 月 4 日及之后的贩卖记载。
- SELECT product_id, SUM(sale_amount) AS total_sales
- FROM sales
- WHERE sale_date >= '2024-01-04'
- GROUP BY product_id
- HAVING SUM(sale_amount) > 400;
复制代码 结果:
product_idtotal_sales103550 (三)执行次序
- WHERE 子句先对 sales 表中的行进行过滤,只选择 sale_date 大于或等于 2024 年 1 月 4 日的记载。
- GROUP BY 对过滤后的数据按 product_id 进行分组。
- HAVING 子句对分组后的结果进行过滤,只选择贩卖总额超过 400 的产物。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |