我有一个包含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
为什么会这样?为什么在最后一个查询中忽略了条件?无论条件如何,它仍然会返回所有元组。
答案 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)。