WHERE 和 HAVING 都是 SQL 中用于筛选数据的子句,但它们有重要的区别
WHERE 子句
-
在 分组前 过滤数据
-
作用于 原始数据行
-
不能使用聚合函数
-
执行效率通常比 HAVING 高
SELECT column1, column2
FROM table
WHERE condition;
HAVING 子句
-
在 分组后 过滤数据
-
作用于 分组结果
-
可以使用聚合函数
-
通常与 GROUP BY 一起使用
SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1
HAVING condition;
主要区别总结
特性 | WHERE | HAVING |
---|---|---|
执行时机 | 分组前 | 分组后 |
作用对象 | 原始行 | 分组结果 |
聚合函数 | 不能使用 | 可以使用 |
性能 | 通常更高效 | 通常较低效 |
使用场景 | 常规数据过滤 | 分组结果过滤 |
示例
-- 使用WHERE筛选单价大于10的产品,然后按类别分组计算平均价格
SELECT category, AVG(price)
FROM products
WHERE price > 10
GROUP BY category;-- 使用HAVING筛选平均价格大于50的类别
SELECT category, AVG(price)
FROM products
GROUP BY category
HAVING AVG(price) > 50;
在实际应用中,WHERE 和 HAVING 经常一起使用,WHERE 先过滤原始数据,GROUP BY 分组后,再用 HAVING 过滤分组结果。