<分区>
我知道这已被广泛讨论,但我的研究都无法说服我区分 MySQL 中的“where
”和“having
”子句。据我了解,我们可以使用 'having
' 实现 'where' 子句可以完成的所有事情。例如。 从用户名='admin' 的用户中选择 *
。那你为什么需要'where
'子句呢?使用 where 会产生任何性能差异吗?
<分区>
我知道这已被广泛讨论,但我的研究都无法说服我区分 MySQL 中的“where
”和“having
”子句。据我了解,我们可以使用 'having
' 实现 'where' 子句可以完成的所有事情。例如。 从用户名='admin' 的用户中选择 *
。那你为什么需要'where
'子句呢?使用 where 会产生任何性能差异吗?
最佳答案
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
关于mysql - 为什么有 'where'的时候有 'having',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090342/