5

我有一个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

4 回答 4

5

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

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

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

于 2011-09-16T03:41:21.403 回答
1

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

于 2016-02-19T10:32:58.580 回答
0

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

于 2011-09-16T03:43:02.510 回答
0

列出时使用了WHERE,但还没有可用的 ALIAS 名称

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

内联过滤行时应该有问题。

于 2012-04-03T10:28:38.050 回答