SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
GROUP BY NR_DZIALU
HAVING NR_DZIALU = 30
或
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
WHERE NR_DZIALU = 30
GROUP BY NR_DZIALU
答案 0 :(得分:66)
理论(理论上我的意思是SQL Standard)说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集。所以WHERE更快。在这方面符合SQL标准的DBMS,只使用HAVING,你不能把条件放在WHERE上(比如某些RDBMS中的计算列。)
你可以看到两者的执行计划并自行检查,没有什么能比这更好(用您的数据测量特定环境中的特定查询。)
答案 1 :(得分:9)
可能取决于引擎。例如,MySQL在链中应用HAVING几乎是最后一个,这意味着几乎没有优化空间。来自manual:
HAVING子句几乎在最后一次应用,就在项目发送到客户端之前,没有优化。 (在HAVING之后应用LIMIT。)
我相信这种行为在大多数SQL数据库引擎中是相同的,但我无法保证。
答案 2 :(得分:5)
这两个查询是等效的,您的DBMS查询优化器应该识别这个并生成相同的查询计划。它可能没有,但情况相当容易识别,所以我希望任何现代系统 - 甚至是Sybase - 来处理它。
HAVING子句应该用于对组函数应用条件,否则它们可以被转换为WHERE条件。例如。如果您想将查询限制为具有COUNT(DZIALU)>的群组10,比方说,你需要将条件置于HAVING中,因为它作用于组,而不是单个行。
答案 3 :(得分:2)
我希望WHERE子句更快,但它们可能会优化到完全相同。
答案 4 :(得分:2)
说他们会优化并不是真正控制并告诉计算机该做什么。我同意使用having不能替代where子句。具有应用于组的特殊用法,其中使用了诸如sum()之类的东西,并且您希望将结果集限制为仅显示具有sum()>的组。超过100本身。在组上工作,在行上工作。它们是苹果和橘子。所以真的,他们不应该被比较,因为他们是两个非常不同的动物。
答案 5 :(得分:1)
“ WHERE”比“ HAVING”快!
查询的分组更为复杂-比较“ HAVING”的执行速度较慢,因为:“ HAVING”“ filter”将处理大量结果,并且还会产生附加的“ filter”循环
“ HAVING”还将使用更多的内存(RAM)
在处理小数据时也是如此-差异很小,可以完全忽略
答案 6 :(得分:1)
如果我们与大量数据进行比较,则“具有”会更慢,因为它适用于记录组,而“ WHERE”适用于行数。.
“在哪里”会限制所有行之前的结果,而“正在”会限制所有行之后的结果
答案 7 :(得分:0)
两个语句都具有相同的性能,因为SQL Server足够聪明,可以将相同的语句解析为类似的计划。
因此,如果在查询中使用WHERE或HAVING,则无关紧要。
但是,理想情况下,你应该在语法上使用WHERE子句。