嵌套查询在哪里

时间:2019-06-11 04:32:39

标签: sql

我有一个包含6个元组的产品表

select productprice
from product 

给出6个元组

100.00
70.00
15.00
90.00
150.00
250.00

我有一个查询:

SELECT productprice     
FROM    product 
WHERE productprice < (SELECT    
AVG(productprice)FROM product);

结果是:

100.00
70.00
15.00
90.00

如果我这样做

SELECT  productprice        
FROM    product 
WHERE (SELECT avg(productprice)
FROM product) > 100

然后我得到:

100.00
70.00
15.00
90.00
150.00
250.00

为什么会这样?为什么在最后一个查询中忽略了条件?无论条件如何,它仍然会返回所有元组。

2 个答案:

答案 0 :(得分:0)

该条件不会被忽略,只是与主查询无关。
子查询(SELECT AVG(c)FROM table 1)返回标量值,外部查询不会以任何方式影响标量值。

在前两个示例中,您已将标量值与外部查询中表的列进行了比较,这就是为什么它会影响结果的原因。

在上一个查询中,您已将其与常量值进行比较-因此,如果c列的平均值大于2(这是您使用的常量值),则外部查询将返回表的所有行。如果您在上一个查询中将>更改为<,它将根本不返回任何行。

更新

根据您为问题更新的数据,整个表的productprice的平均值为112.5

在第二个查询中,您将返回productprice值小于112.5的所有行。

对于第三个查询-您的where条件为112.5 > 100-因此,select语句返回表中的所有行。

答案 1 :(得分:0)

最终查询中的选择与行的内容无关。

在前面的查询中,您正在将该行上的c值与平均值进行比较,该平均值将逐行不同。

在上一个查询中,您选择所有行c的平均值均大于100的位置。将获得所有行或不获取任何行,具体取决于平均值是否大于100。在这种情况下,平均值为112.5,因此您的where子句实际上是WHERE 112.5 > 100,适用于所有行。

要获取行数据的子集,您需要选择一些与行不同的条件。例如,WHERE c > 100将仅返回两行(150和250)。