我们对行组使用HAVING
,对各行使用WHERE
但以下是有效的:
SELECT Salesperson, SUM(TotalSale)
FROM SALES
GROUP BY Salesperson
HAVING Salesperson <> 'Georgio';
即。在没有聚合函数的情况下使用HAVING
。那么我们还不能使用WHERE Salesperson <> 'Georgio';
吗?
答案 0 :(得分:3)
最简单的答案是,HAVING
同时支持条件(简单和聚合条件),而WHERE
不支持聚合条件。
此外,在记录分组后评估HAVING
。
答案 1 :(得分:2)
是。不同之处在于{<1}}子句在聚合之后被评估,而HAVING
子句在之前被评估。
这通常会导致使用WHERE
提高性能,但这并非总是如此。例如,取the following:
WHERE
This query最好是create table foo(type int, data int);
create index bar on foo(id);
insert into foo values(1,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(3,3);
insert into foo values(5,3);
:
WHERE
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo ref bar bar 5 const 1 100 Using where
select type, sum(data)
from foo
where type = 5
group by type;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo index bar 5 8 100
但this query实际上更好地表现为select type, sum(data)
from foo
group by type
having type = 5;
,因为值HAVING
不够具有选择性:
type=2
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo ALL bar 8 62.5 Using where
select type, sum(data)
from foo
where type = 2
group by type;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo index bar 5 8 100
答案 2 :(得分:1)
对于您的特定查询,答案是肯定的 在哪里(大多数情况下)更好地使用,性能明智
看起来像这样,分组/聚合的数据越少,sql server的负担越少, 所以。 “where”提供更好的性能,因为工作量较少,
但是在您的查询中,您使用&lt;&gt; /不等于 这是sql server要执行的(硬)过滤器,所以你最终可能会更快地使用having子句,因为服务器发现它更容易分组所有内容然后删除这个例子,
但我怀疑,查询优化器会说什么?
答案 3 :(得分:0)
您可以拥有但是您将失去每个销售人员的总销售额的能力;)
最好同时使用WHERE和HAVING ......