软件测试高频SQL问题之having和where的区别
本文最后更新于 2024-08-24,文章内容可能已经过时。
在SQL中,HAVING
和 WHERE
都用于过滤数据,但它们的用法和作用范围有所不同。以下是它们的主要区别:
1. 作用范围不同
WHERE: 用于在SQL查询中过滤从数据库表中选择的行。它在数据分组(GROUP BY)之前进行过滤操作。
HAVING: 用于过滤通过分组(GROUP BY)后的组。它通常与聚合函数(如 COUNT、SUM、AVG 等)一起使用。
2. 适用条件不同
WHERE: 不能与聚合函数一起直接使用。它主要用于指定行级别的条件。
HAVING: 可以与聚合函数一起使用,用于指定组级别的条件。
示例
假设我们有一个名为 sales
的表,包含以下列:
id
: 售货记录的唯一标识salesperson
: 销售人员的名字amount
: 销售金额date
: 销售日期
使用 WHERE 过滤行
假如我们想要查询销售金额大于100的记录,可以使用 WHERE
子句:
SELECT * FROM sales
WHERE amount > 100;
使用 HAVING 过滤组
假如我们想要查询每个销售人员的总销售额大于500的记录,可以使用 HAVING
子句:
SELECT salesperson, SUM(amount) AS total_sales
FROM sales
GROUP BY salesperson
HAVING SUM(amount) > 500;
在这个例子中,WHERE
不能用于过滤 SUM(amount)
的结果,因为 WHERE
在数据分组之前执行,而 HAVING
在分组之后执行。
总结
WHERE: 用于在数据分组之前过滤行,不能与聚合函数一起直接使用。
HAVING: 用于在数据分组之后过滤组,可以与聚合函数一起使用。
这两个子句可以在同一个查询中一起使用,以实现更复杂的过滤条件。例如:
SELECT salesperson, SUM(amount) AS total_sales
FROM sales
WHERE date >= '2024-01-01'
GROUP BY salesperson
HAVING SUM(amount) > 500;
在这个查询中,WHERE
子句首先过滤出2024年及以后的销售记录,然后 GROUP BY
子句对结果进行分组,最后 HAVING
子句过滤出总销售额大于500的销售人员。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Lin
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果