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)
这两种方法是否有任何性能优势,或者它们在功能上是否相同?
这两个版本在功能上是相同的.好吧,第二个在语法上是不正确的,但我认为你的意思是:
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引擎都应该使用索引(如果适用),无论是两种情况还是两种情况.
所以,前面回答这个具体问题是,在任何合理的数据库,这些都应该引起相同的执行计划(即在使用索引,并行的用户,以及聚合算法的选择).但是,在功能上等同并不意味着给定的数据库引擎将产生相同的执行计划.所以,一般的答案是"不".
| 归档时间: |
|
| 查看次数: |
10642 次 |
| 最近记录: |