当'有'时,为什么你有'哪里'

时间:2013-02-26 13:29:40

标签: mysql sql where where-clause having-clause

我知道这个问题已经讨论得很多了,但我的研究都没有让我相信MySQL中“where”和“having”条款之间的区别。根据我的理解,我们可以使用'having'实现'where'子句可以完成的所有操作。例如。 select * from users having username='admin'。那为什么你需要'where'条款?使用where会产生任何性能差异吗?

4 个答案:

答案 0 :(得分:6)

WHERE子句在聚合之前过滤来自源的数据,而HAVING子句在应用GROUP BY之后过滤数据。通常,这意味着任何非聚合过滤器都可以出现在任何一个位置,但如果您的查询中没有引用的列,则只能在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)

来自HAVING子句的WHERE之间的区别在于HAVING支持聚合列,而WHERE不支持聚合列,因为它仅适用于单个行。,EG

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

来自MySQL文档,

“如果你使用HAVING而不是WHERE,你可以使用Alias。这是两个子句之间定义的差异之一。拥有也更慢并且不会被优化,但是如果你放置一个像这样的复杂函数在你显然没有期待速度的地方。“

答案 2 :(得分:1)

其中评估单行级别,而has用于分组表达式。

答案 3 :(得分:1)

使用HAVING子句,您可以指定过滤的条件,而不是过滤个人 行,发生在WHERE阶段。

只有HAVING中逻辑表达式的组 HAVING阶段返回子句计算结果为TRUE。逻辑表达式求值为FALSE or UNKNOWN的组将被过滤掉。

如果未使用GROUP BY,则HAVING的行为类似于WHERE子句。 关于效果比较,请参阅此article