有子句与子查询

时间:2012-10-17 21:49:16

标签: sql subquery having

我可以用两种方式使用聚合函数编写查询:

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

这两种方法是否有任何性能优势,或者它们在功能上是否相同?

1 个答案:

答案 0 :(得分:7)

这两个版本在功能上是相同的。好吧,第二个在语法上是不正确的,但我认为你的意思是:

select * 
from (
    select team, count(min) as count
    from table
    group by team
) t
where count > 500

(您需要计算别名,并且几个主要数据库需要FROM子句中子查询的别名。)

在功能上等同意味着它们必须以相同的方式进行优化。通常有多种方法来编写功能相同的查询。但是,特定的数据库引擎/优化器可以选择(并且通常会选择)不同的优化路径。

在这种情况下,查询非常简单,很难想到多个优化路径。对于这两个版本,引擎基本上必须聚合查询,然后测试第二列的过滤器。我个人看不到这个主题的很多变化。任何体面的SQL引擎都应该在两种情况下都使用索引,或者两种情况都不使用。

因此,对这个特定问题的回答是,在任何合理的数据库中,这些应该导致相同的执行计划(即,使用索引,并行用户和聚合算法的选择)。但是,在功能上等同并不意味着给定的数据库引擎将产生相同的执行计划。所以,一般的答案是“不”。