拥有和在哪里

时间:2013-03-14 08:11:00

标签: mysql sql group-by aggregate-functions having-clause

我们对行组使用HAVING,对各行使用WHERE 但以下是有效的:

SELECT Salesperson, SUM(TotalSale)  
   FROM SALES  
   GROUP BY Salesperson  
   HAVING Salesperson <> 'Georgio';    

即。在没有聚合函数的情况下使用HAVING。那么我们还不能使用WHERE Salesperson <> 'Georgio';吗?

4 个答案:

答案 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 ......