我知道讨论的很多,但是我的研究都无法说服MySQL中的where‘和having‘子句之间的区别。据我了解,我们可以使用’ having‘实现’where’子句可以完成的所有工作。例如。select * from users having username='admin'。那为什么需要’ where‘子句?在何处使用会产生性能差异吗?
where
having
select * from users having username='admin'
该WHERE子句在聚合之前从源中筛选数据,而HAVING子句GROUP BY在应用后在源数据中筛选。通常,这意味着任何非聚合过滤器都可以出现在任一位置,但是如果您的查询中没有引用列,则只能在WHERE子句中对其进行过滤。
WHERE
HAVING
GROUP BY
例如,如果您有下表:
| 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子句来代替:
ID > 2
ID
SELECT
select value, count(value) from Table1 where id > 2 group by value
演示:http ://www.sqlfiddle.com/#!2/ f6741/16