一尘不染

为什么有“有”时为什么有“哪里”

sql

我知道讨论的很多,但是我的研究都无法说服MySQL中的where‘和having‘子句之间的区别。据我了解,我们可以使用’
having‘实现’where’子句可以完成的所有工作。例如。select * from users having username='admin'。那为什么需要’ where‘子句?在何处使用会产生性能差异吗?


阅读 117

收藏
2021-05-23

共1个答案

一尘不染

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

但是您只想在where中包含行ID > 2。如果将其放在HAVING子句中,则会收到
错误消息

,因为该ID列在子集合中不可用,因为它不在SELECT子句中。在这种情况下,您将需要使用WHERE子句来代替:

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

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

2021-05-23