我可以用两种方式使用聚合函数编写查询:
select team, count(min) as min_count
from table
group by team
having count(min) > 500
或
select *
from (
select team, count(min) as min_count
from table
group by team
) as A
where A.min_count > 500
这两种方法是否有任何性能优势,或者它们在功能上是否相同?
答案 0 :(得分:7)
这两个版本在功能上是相同的。好吧,第二个在语法上是不正确的,但我认为你的意思是:
select *
from (
select team, count(min) as count
from table
group by team
) t
where count > 500
(您需要计算别名,并且几个主要数据库需要FROM
子句中子查询的别名。)
在功能上等同不意味着它们必须以相同的方式进行优化。通常有多种方法来编写功能相同的查询。但是,特定的数据库引擎/优化器可以选择(并且通常会选择)不同的优化路径。
在这种情况下,查询非常简单,很难想到多个优化路径。对于这两个版本,引擎基本上必须聚合查询,然后测试第二列的过滤器。我个人看不到这个主题的很多变化。任何体面的SQL引擎都应该在两种情况下都使用索引,或者两种情况都不使用。
因此,对这个特定问题的回答是,在任何合理的数据库中,这些应该导致相同的执行计划(即,使用索引,并行用户和聚合算法的选择)。但是,在功能上等同并不意味着给定的数据库引擎将产生相同的执行计划。所以,一般的答案是“不”。