SQL Server两个查询的差异:返回的productID是否相同?
两个SQL查询的差异解析
先看两个查询的代码:
查询1代码
SELECT productID, SUM(soldQty) FROM Sales WHERE soldQty <> 0 GROUP BY ProductID
查询1返回的productID
这个查询会先过滤掉所有soldQty等于0的行,再按productID分组计算剩余行的soldQty总和。最终返回的是所有至少存在一条非0soldQty记录,且这些非0记录的总和不等于0的productID。
如果某个productID的所有非0记录总和为0,哪怕它还有soldQty为0的记录,也不会被返回。
查询2代码
SELECT productID, SUM(soldQty) FROM Sales GROUP BY ProductID HAVING SUM(soldQty) <> 0
查询2返回的productID
这个查询会先按productID分组,计算该ID下所有行(包括soldQty为0的行)的soldQty总和,再过滤掉总和等于0的分组。最终返回的是所有分组后soldQty总和不等于0的productID。
二者结果是否相同?
结果是完全相同的。原因如下:
- 对于任意productID,它的所有行的
soldQty总和,等于它的非0soldQty记录的总和(因为0加进去不会改变总和)。 - 因此,“非0记录的总和不等于0”和“所有行的总和不等于0”是等价条件。
- 同时,若某个productID只有
soldQty为0的记录,两个查询都不会返回它;若存在非0记录但总和为0,两个查询也都不会返回它;若总和不为0,两个查询都会返回它。
唯一的区别是性能:查询1先过滤掉0的行,分组时处理的数据量更少,在数据量大的场景下性能会更优。
内容的提问来源于stack exchange,提问作者Adele
相关产品推荐
相关产品推荐

