我们对行组使用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';
代替吗?
你可以有,但你会失去销售总额为每个销售人员的能力;)
最好能同时使用WHERE和HAVING ....
的simpliest的答案是,HAVING
支持两种情况(简单和汇总条件),而WHERE
不能支持聚合条件。
另外,HAVING
在记录分组后进行评估。
我会补充说他**应**已经使用'WHERE',因为它会表现更好。 – cypher 2013-03-14 08:19:23
是的。所不同的是HAVING
子句在之后被评估为聚合,而WHERE
子句之前。
这通常会导致使用WHERE
的性能提高,但这并非总是如此。例如,采取the following:
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);
This query是作为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 Using 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 index bar 5 8 100
但是this query实际上是更好performaning为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 Using 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 index bar 5 8 100
我明白了。但这意味着我们事先知道'5'对于'type'字段比'2'更具有选择性。但是当我们编写查询时,我们通常不知道这样的统计信息,对吗? – Jim 2013-03-14 08:45:32
@Jim不,我们没有。但是我们可能统计知道,通过查看大量用户提出的常规查询的EXPLAIN结果,“HAVING”可能是更好的选择。但实际上,1)大多数情况下'WHERE'更好,以及2)这种优化最好只作为已经很差的查询的最后手段,而不是预先或主动地进行。我只是指出了一个有趣的例子,说WHERE不总比HAVING更好。 – 2013-03-14 08:54:30
答案是肯定的对您的具体问题 哪里是(对于大多数部分)更好地使用,性能明智
看到它是这样的,更少的数据进行分组/聚合的负担更少的SQL服务器, 等等。 “其中”提供更好的性能的原因有更少的工作要做,
但是在您的查询您使用<> /不等于 这是一个(硬)过滤器为SQL Server做的,所以你可能最终在有条款更快,由于服务器发现它更容易只分组一切,然后删除这个例子,
但是我怀疑,查询优化器说什么?
你可以在这里得到一些很好的见解:http://www.codeproject.com/Articles/25258/Where-Vs-Having-Difference-between-having-and-Wher – 2013-03-14 08:15:10