有子句与子查询

fer*_*cs2 14 sql subquery having

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

select team, count(min) as min_count
from table
group by team
having count(min) > 500
Run Code Online (Sandbox Code Playgroud)

要么

select * 
from (
    select team, count(min) as min_count
    from table
    group by team
) as A
where A.min_count > 500
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 8

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

select * 
from (
    select team, count(min) as count
    from table
    group by team
) t
where count > 500
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以,前面回答这个具体问题是,在任何合理的数据库,这些都应该引起相同的执行计划(即在使用索引,并行的用户,以及聚合算法的选择).但是,在功能上等同并不意味着给定的数据库引擎将产生相同的执行计划.所以,一般的答案是"不".