单个表子查询是否可以/应该扁平化

问题描述 投票:0回答:1

我正在复习我正在学习的 sql 课程的课程材料,它提到为了使程序运行得更快,并使用连接而不是子查询一次性运行。它指出,如果大多数子查询遵循 IN、EXISTS 或生成单个值,则可以进行扁平化,而大多数遵循 NOT EXISTS 或包含 GROUP BY 的子查询则无法扁平化。所以我想知道是否可以在单个表上使用联接而不是子查询,或者由于它已经在同一个表中,所以它已经在一次传递中发生并且没有理由使用联接。

例如,我被要求选择所有高于平均身高的马名称,其中所有数据都已经在同一个“马”表中。如果我要做子查询,这就是我想到的

SELECT RegisteredName, Height
FROM Horse
WHERE Height > 
   (SELECT AVG(Height)
   FROM Horse)
ORDER BY Height

这就是你会做的事情还是我错过了我会做的事情。表中没有很大的价值可以将其自连接到。我可以添加另一个,这样我就可以并且使它更快吗?我的问题是正确的,我只是想知道是否有更好的方法来做到这一点

sql subquery flatten self-join
1个回答
0
投票

您对子查询的理解和使用来解决选择高于平均身高的马名的问题是绝对正确的,并且有效地处理了要求。在 SQL 中,使用子查询确实非常有效,尤其是在将值与在同一个表上计算的聚合进行比较的情况下。

在您的具体情况下,您的 SQL 查询:

SELECT RegisteredName, Height
FROM Horse
WHERE Height > 
   (SELECT AVG(Height)
   FROM Horse)
ORDER BY Height
鉴于查询很简单,

可能是解决此要求的最佳方法,并且任何替代方法不一定会提供性能优势。您使用的子查询是标量子查询(返回单个值),通常 SQL 数据库系统对其进行了很好的优化,特别是在表不是很大或者查询可以有效利用索引的情况下。

© www.soinside.com 2019 - 2024. All rights reserved.