SQL 中 WHERE 与 HAVING 子句的利用

打印 上一主题 下一主题

主题 963|帖子 963|积分 2889

在编写 SQL 查询时,数据过滤是常见需求。WHERE 和 HAVING 子句虽然都用于筛选数据,但实际用法大不雷同。本文通过详细示例对比两者的核心区别,并结合实际场景演示连合利用本领,助力快速掌握这两个关键工具的正确用法。
一、数据表结构

假设存在 sales 表,其结构如下:
sale_idproduct_idsale_datesale_amount11012024-01-0110021012024-01-0220031022024-01-0315041032024-01-0430051032024-01-05250 二、WHERE 子句

(一)功能

用于过滤行数据,直接作用于表中的单行数据,在分组操纵之前应用。
(二)特点

不能利用聚合函数。
假设尝试在 WHERE 中利用聚合函数:
  1. SELECT product_id, SUM(sale_amount) AS total_sales
  2. FROM sales
  3. WHERE SUM(sale_amount) > 150;  -- ❌ 错误:WHERE 无法使用聚合函数
复制代码
错误原因
执行 WHERE 时,尚未对 sale_amount 进行求和盘算,因此 SUM(sale_amount) 不存在。
(三)准确示例

假设要找出 sale_amount 大于 150 的贩卖记载。
  1. SELECT *
  2. FROM sales
  3. WHERE sale_amount > 150;
复制代码
结果
sale_idproduct_idsale_datesale_amount21012024-01-0220041032024-01-0430051032024-01-05250 三、HAVING 子句

(一)功能

用于过滤分组后的结果集,作用于分组后的数据,在分组操纵之后应用。
(二)特点

可以利用聚合函数(如 SUM()、AVG()、COUNT() 等)来定义过滤条件。
(三)详细示例

假设要找出贩卖总额超过 400 的产物。
  1. SELECT product_id, SUM(sale_amount) AS total_sales
  2. FROM sales
  3. GROUP BY product_id
  4. HAVING SUM(sale_amount) > 400;
复制代码
结果
product_idtotal_sales103550 四、WHERE 和 HAVING 结合利用

(一)利用场景

当需要先对行数据进行过滤,再对分组结果进行过滤时,可结合利用 WHERE 和 HAVING 子句。
(二)示例

假设要找出贩卖总额超过 400 的产物,并且只考虑在 2024 年 1 月 4 日及之后的贩卖记载。
  1. SELECT product_id, SUM(sale_amount) AS total_sales
  2. FROM sales
  3. WHERE sale_date >= '2024-01-04'
  4. GROUP BY product_id
  5. HAVING SUM(sale_amount) > 400;
复制代码
结果
product_idtotal_sales103550 (三)执行次序


  • WHERE 子句先对 sales 表中的行进行过滤,只选择 sale_date 大于或等于 2024 年 1 月 4 日的记载。
  • GROUP BY 对过滤后的数据按 product_id 进行分组。
  • HAVING 子句对分组后的结果进行过滤,只选择贩卖总额超过 400 的产物。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表