理论(理论上我的意思是SQL标准)说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集.所以WHERE更快.在这方面符合SQL标准的DBMS,只使用HAVING,你不能把条件放在WHERE上(比如某些RDBMS中的计算列).
你可以看到两者的执行计划并自行检查,没有什么能比这更好(用您的数据测量特定环境中的特定查询.)
理论(理论上我的意思是SQL标准)说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集.所以WHERE更快.在这方面符合SQL标准的DBMS,只使用HAVING,你不能把条件放在WHERE上(比如某些RDBMS中的计算列).
你可以看到两者的执行计划并自行检查,没有什么能比这更好(用您的数据测量特定环境中的特定查询.)
它可能取决于引擎.例如,MySQL在链中应用HAVING几乎是最后一个,这意味着几乎没有优化空间.从手册:
几乎在最后一次应用HAVING子句,就在将项目发送到客户端之前,没有优化.(在HAVING之后应用LIMIT.)
我相信这种行为在大多数SQL数据库引擎中是相同的,但我无法保证.
这两个查询是等效的,您的DBMS查询优化器应该识别这个并生成相同的查询计划.它可能没有,但情况相当容易识别,所以我希望任何现代系统 - 甚至是Sybase - 来处理它.
应使用HAVING子句对组函数应用条件,否则可以将它们转换为WHERE条件.例如.如果你想将查询限制在COUNT(DZIALU)> 10的组,比如说,你需要将条件置于HAVING中,因为它作用于组,而不是单个行.