我有一个基于某些表的连接的视图(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)????)
答案 0 :(得分:5)
WHERE
用于根据条件过滤查询结果。
HAVING
用于对聚合函数的结果应用过滤器。如果没有聚合函数,它的功能与WHERE相同。
答案 1 :(得分:1)
用于汇总函数,如sum,avg等,它只能在select语句中使用.where子句不能在聚合条件下工作 例如:sum(mark)> 300 //它不是真的
答案 2 :(得分:0)
这取决于视图的定义 - having子句应该只应用于聚合查询并在分组后应用它。你看过两个查询计划(带解释)吗?
答案 3 :(得分:0)
WHERE ,并且还没有ALIAS名称
HAVING 在列出所有可能的行后过滤行,以便生成ALIAS名称
在内联过滤行时应该会出现问题。