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
有帮助吗?

解决方案

在理论(由理论我的意思是 SQL标准 )说,WHERE限制的结果返回行和HAVING之前设置限制的结果将所有的行后进行设置。那么,是更快的。在SQL标准在这方面兼容的DBMS,只能使用具有在那里你不能把条件对一个WHERE(如在一些RDBMS的计算列。)

你能看到的执行计划都和自己查一下,什么也不会击败(测量在您与您的数据的特定环境特定的查询。)

其他提示

它可能取决于发动机。 MySQL的例子,几乎适用最后在链,这意味着几乎不存在优化空间。从手册

  

在HAVING子句几乎最后应用,只是在项目被发送到客户端,没有优化。 (LIMIT是具有后应用。)

我认为这种行为是在大多数SQL数据库引擎是相同的,但我不能保证这一点。

这两个查询是等价的,你的DBMS的查询优化器的的认识到这一点,并产生产生相同的查询计划。它可能不是,但情况是相当简单的认识,所以我期待任何现代系统 - 甚至的Sybase - 对付它

HAVING条款应该被用于施加于组功能的条件,否则它们可mvoed到WHERE条件。例如。如果你想限制你的查询有COUNT组(DZIALU)> 10,比方说,你就需要把状态变成HAVING因为它作用于群体,而不是个别行。

我期望的WHERE子句会更快,但它可能他们会优化完全相同的。

说,他们将优化是不是真的采取控制,并告诉计算机做什么。我会同意,使用具有的不是一个where子句的替代品。其具有的通过是用在类似的总和()被应用到一组特殊的用法,你想限制结果设置为显示具有和()>超过100本身只向组。有对组作品,凡适用于行。他们是苹果和桔子。因此,其实,他们不应该比较,它们是两个完全不同的动物。

这两个语句都将被具有相同性能的SQL Server是足够聪明,这两个相同的语句解析成一个类似的方案。

所以,如果你使用WHERE,或您的查询也无所谓。

不过,理想情况下,你应该使用WHERE子句语法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top