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