哪个SQL语句更快?(HAVING vs. WHERE ......)

M_1*_*M_1 41 sql performance grouping if-statement

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30
Run Code Online (Sandbox Code Playgroud)

要么

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
Run Code Online (Sandbox Code Playgroud)

Vin*_*vic 68

理论(理论上我的意思是SQL标准)说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集.所以WHERE更快.在这方面符合SQL标准的DBMS,只使用HAVING,你不能把条件放在WHERE上(比如某些RDBMS中的计算列).

你可以看到两者的执行计划并自行检查,没有什么能比这更好(用您的数据测量特定环境中的特定查询.)

  • 我说的是执行计划,您可以在其中看到数据库将执行哪些步骤来获取您的数据。150 行太少,无法注意到执行时间的任何差异,但如果计划不同,那么这对于行数较多的表来说会很重要。在运行查询之前“设置显示计划”... (2认同)

Era*_*rin 9

它可能取决于引擎.例如,MySQL在链中应用HAVING几乎是最后一个,这意味着几乎没有优化空间.从手册:

几乎在最后一次应用HAVING子句,就在将项目发送到客户端之前,没有优化.(在HAVING之后应用LIMIT.)

我相信这种行为在大多数SQL数据库引擎中是相同的,但我无法保证.

  • 好吧,我只能谈论我所知道的并推测其余的:) (3认同)

Mik*_*use 5

这两个查询是等效的,您的DBMS查询优化器应该识别这个并生成相同的查询计划.它可能没有,但情况相当容易识别,所以我希望任何现代系统 - 甚至是Sybase - 来处理它.

应使用HAVING子句对组函数应用条件,否则可以将它们转换为WHERE条件.例如.如果你想将查询限制在COUNT(DZIALU)> 10的组,比如说,你需要将条件置于HAVING中,因为它作用于组,而不是单个行.