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

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


两种方法都对性能有好处吗?或者它们在功能上是同一回事吗?

最佳答案

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

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


(您需要在计算上使用别名,并且几个领先的数据库在FROM子句中的子查询上也需要使用别名。)

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

在这种情况下,查询是如此简单,以至于很难想到多个优化路径。对于这两个版本,引擎基本上都必须汇总查询,然后测试第二列的过滤器。我个人看不到这个主题的许多变化。任何适当的SQL引擎都应在两种情况下(或两种情况都没有)使用索引。

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

关于sql - 有子句与子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12943960/

10-11 05:13
查看更多