我知道这个问题有很多讨论,但是我的研究没有一个可以让我相信MySQL中的'where
'和'having
'子句之间的区别。根据我的理解,我们可以使用'having
'来实现'where'子句可以完成的任何事情。例如。 select * from users having username='admin'
。那么为什么你需要'where
'条款?在哪里使用任何性能差异?为什么在'有'的时候有'where'
回答
的WHERE
子句过滤器数据聚集体之前,而已经施加GROUP BY
后HAVING
子句过滤器的数据。通常这意味着任何非聚合过滤器都可以出现在任何地方,但是如果您的查询中没有引用该列,则只能在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
在单行级别评估,而用于按表达式分组。
从WHERE
条款HAVING
之间的区别是,HAVING
支持合计列,而WHERE
不会因为它仅适用于各行,EG
SELECT ID
FROM tableName
GROUP BY ID
HAVING COUNT(ID) > 1 --- <<== HERE
从MySQL的文档,
“如果您使用HAVING而不是WHERE这是两个子句之间定义的区别之一,您可以使用Alias。具有也较慢并且不会操作但是如果你将这样的复杂功能放置在你显然不期待速度的地方。“
谢谢。但是我知道它们之间的区别。为什么你需要使用何时可以通过使用子句来实现一切? – Sethunath 2013-02-26 13:33:11
在你的例子中他们做同样的事情,但如果你是一个很好的SQL开发人员,你应该知道在哪里使用这两个关键字。 'WHERE'在HAVING'子句之前首先被评估。 – 2013-02-26 13:41:26
从MySQL文档中,*“如果您使用HAVING而不是WHERE这是两个子句之间定义的区别之一,您可以使用Alias。速度慢也不会被优化,但如果您将复杂函数这在你明显不期待速度很快的地方。“* – 2013-02-26 13:42:39
随着HAVING
子句,可以指定一个条件来过滤基相对于过滤个别 行,这恰好在WHERE
相。 HAVING
阶段仅返回HAVING
子句中的逻辑表达式为TRUE的组。逻辑表达式求值为FALSE or UNKNOWN
的组被过滤掉。
当不使用GROUP BY
时,HAVING
表现为WHERE
子句。 关于性能比较请参阅从源此article
- 1. 什么时候File.join有用?
- 2. 什么时候InputStream.available()有用?
- 3. 什么时候__proto__有用?
- 4. 为什么有时候viewDidLoad首先被调用,有时候被称为后者?
- 5. phpunit:什么时候有用预计任何()?,为什么存在?
- 6. QTreeWidget :: currentItem什么时候没有选择什么时候返回?
- 7. ThisTime&TotalTime有什么区别?为什么有时候两个值是相等的,有时候会不一样?
- 8. 什么时候在桌子上没有索引是有意义的,为什么?
- 9. 什么时候sys.stdin在Python中没有?
- 10. 为什么UISearchDisplayController有时会工作,有时候不行?
- 11. 为什么有时候我的对象属性没有更新?
- 12. 什么时候创建了app.config,什么时候app.exe.config和有什么区别
- 13. 什么时候和为什么没有实现(java.lang.reflect.InvocationTargetException)发生?
- 14. 块变量使用__weak为什么有时候有值,有时为零
- 15. 为什么在进行文件比较的时候有“ï¿¿”
- 16. 在序列化BST的时候为什么有序?
- 17. 为什么有时候SSL徽章上有名字?
- 18. 为什么`VECTOR`和`[...]`有时候行为不同的Clojure?
- 19. LINQ语句没有where子句时为什么没有intellisense?
- 20. dynamic_cast <void*>什么时候有用?
- 21. 什么时候放弃MVVM有意义?
- 22. 变量变量:什么时候有用?
- 23. 守护线程什么时候有用?
- 24. 什么时候ASP.NET Expression Builders最有用?
- 25. 测试什么时候没有属性
- 26. 匿名类型,什么时候有用?
- 27. 什么时候是SqlConnection.RetrieveStatistics()有用?
- 28. 什么时候循环有用?
- 29. DatePicker没有什么时候点击
- 30. 什么时候有人关注 - Twitter API
还看到:SQL - 有VS哪里(http://stackoverflow.com/questions/9253244 ); [WHERE VS HAVING](http://stackoverflow.com/questions/2905292) – mellamokb 2013-02-26 13:32:27