我们HAVING
用于行组和WHERE
单个行。
但以下是有效的:
SELECT Salesperson, SUM(TotalSale)
FROM SALES
GROUP BY Salesperson
HAVING Salesperson <> 'Georgio';
即HAVING
不使用聚合函数。那么我们不能也使用它WHERE Salesperson <> 'Georgio';
吗?
我们HAVING
用于行组和WHERE
单个行。
但以下是有效的:
SELECT Salesperson, SUM(TotalSale)
FROM SALES
GROUP BY Salesperson
HAVING Salesperson <> 'Georgio';
即HAVING
不使用聚合函数。那么我们不能也使用它WHERE Salesperson <> 'Georgio';
吗?
最简单的答案是,HAVING
同时支持条件(简单条件和聚合条件),而WHERE
不能支持聚合条件。
此外,HAVING
在对记录进行分组后进行评估。
是的。不同之处在于,子句在聚合之后HAVING
进行评估,而子句在 之前。WHERE
这通常会通过使用 来提高性能WHERE
,但并非总是 100% 如此。例如,采取以下措施:
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
:
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 ref bar bar 5 const 1 100 使用 where
select type, sum(data)
from foo
group by type
having type = 5;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo 索引栏 5 8 100
但这个查询实际上作为 a 的性能更好HAVING
,因为该值type=2
的选择性不够:
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 ALL bar 8 62.5 使用 where
select type, sum(data)
from foo
group by type
having type = 2;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE foo 索引栏 5 8 100
对于您的特定查询,答案是肯定的
像这样看,分组/聚合的数据越少,sql server 的负担就越小,所以。"where" 提供更好的性能,因为要做的工作更少,
但是,在您的查询中,您使用 <> / 不等于这是 sql 服务器执行的(硬)过滤器,因此您最终可能会遇到更快的 having 子句,因为服务器发现将所有内容分组更容易然后删除这个例子,
但是我怀疑,查询优化器说什么?
你可以有,但你会失去对每个销售人员的总销售额求和的能力;)
最好同时使用 WHERE 和 HAVING....