2013-02-26 42 views
7

我知道这个问题有很多讨论,但是我的研究没有一个可以让我相信MySQL中的'where'和'having'子句之间的区别。根据我的理解,我们可以使用'having'来实现'where'子句可以完成的任何事情。例如。 select * from users having username='admin'。那么为什么你需要'where'条款?在哪里使用任何性能差异?为什么在'有'的时候有'where'

+1

还看到:SQL - 有VS哪里(http://stackoverflow.com/questions/9253244 ); [WHERE VS HAVING](http://stackoverflow.com/questions/2905292) – mellamokb 2013-02-26 13:32:27

回答

6

WHERE子句过滤器数据聚集体之前,而已经施加GROUP BYHAVING子句过滤器的数据。通常这意味着任何非聚合过滤器都可以出现在任何地方,但是如果您的查询中没有引用该列,则只能在WHERE子句中对其进行过滤。

例如,如果你有如下表:

| ID | VALUE | 
-------------- 
| 1 | 15 | 
| 2 | 15 | 
| 3 | 20 | 
| 4 | 20 | 
| 5 | 25 | 
| 6 | 30 | 
| 7 | 40 | 

假设你想申请以下查询:

select value, count(value) 
from Table1 
group by value 

但你只希望包括行,其中ID > 2。如果将它放在HAVING子句中,则会得到error,因为ID列在聚合后不可用,因为它不在SELECT子句中。在这种情况下,你将被要求使用WHERE条款改为:

select value, count(value) 
from Table1 
where id > 2 
group by value 

演示:http://www.sqlfiddle.com/#!2/f6741/16

1

在单行级别评估,而用于按表达式分组。

3

WHERE条款HAVING之间的区别是,HAVING支持合计列,而WHERE不会因为它仅适用于各行,EG

SELECT ID 
FROM tableName 
GROUP BY ID 
HAVING COUNT(ID) > 1 --- <<== HERE 

从MySQL的文档,

“如果您使用HAVING而不是WHERE这是两个子句之间定义的区别之一,您可以使用Alias。具有也较慢并且不会操作但是如果你将这样的复杂功能放置在你显然不期待速度的地方。“

+0

谢谢。但是我知道它们之间的区别。为什么你需要使用何时可以通过使用子句来实现一切? – Sethunath 2013-02-26 13:33:11

+0

在你的例子中他们做同样的事情,但如果你是一个很好的SQL开发人员,你应该知道在哪里使用这两个关键字。 'WHERE'在HAVING'子句之前首先被评估。 – 2013-02-26 13:41:26

+1

从MySQL文档中,*“如果您使用HAVING而不是WHERE这是两个子句之间定义的区别之一,您可以使用Alias。速度慢也不会被优化,但如果您将复杂函数这在你明显不期待速度很快的地方。“* – 2013-02-26 13:42:39

1

随着HAVING子句,可以指定一个条件来过滤相对于过滤个别 行,这恰好在WHERE相。

HAVING阶段仅返回HAVING 子句中的逻辑表达式为TRUE的组。逻辑表达式求值为FALSE or UNKNOWN的组被过滤掉。

当不使用GROUP BY时,HAVING表现为WHERE子句。 关于性能比较请参阅从源此article

相关问题