MySQL Query中的HAVING和WHERE有什么区别?

时间:2011-09-16 03:37:40

标签: mysql select where-clause having-clause

我有一个基于某些表的连接的视图(viewX):

当我使用WHERE时,查询被延迟,处理器使用率达到50%,最后我需要关闭mysqld.exe服务并重新启动以尝试再次解决问题。

当我使用HAVING时,查询会完美而快速地执行,我得到结果并且一切准备就绪。

查询类似于:

SELECT * FROM viewX WHERE column_of_view = 'foo'

SELECT * FROM viewX HAVING column_of_view = 'foo'

发生了什么事?

我找到的解决方案是做这样的事情:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'

两种查询都很精细,但我觉得这很糟糕! (SELECT * FROM(... viewX)????)

4 个答案:

答案 0 :(得分:5)

WHERE用于根据条件过滤查询结果。

HAVING用于对聚合函数的结果应用过滤器。如果没有聚合函数,它的功能与WHERE相同。

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

答案 1 :(得分:1)

用于汇总函数,如sum,avg等,它只能在select语句中使用.where子句不能在聚合条件下工作 例如:sum(mark)> 300 //它不是真的

答案 2 :(得分:0)

这取决于视图的定义 - having子句应该只应用于聚合查询并在分组后应用它。你看过两个查询计划(带解释)吗?

答案 3 :(得分:0)

列出时使用了

WHERE ,并且还没有ALIAS名称

HAVING 在列出所有可能的行后过滤行,以便生成ALIAS名称

在内联过滤行时应该会出现问题。