sqlite SELECT AVG返回null

时间:2009-07-14 00:06:47

标签: sql sqlite average

有人知道为什么SQL SELECT查询在从空表中选择时不返回任何行,但是当尝试从空表中的列中选择AVG时,它返回< null>?行为上的差异对我来说似乎很奇怪。我正在使用sqlite数据库,如果这有任何区别。

以下是两个查询:

正常选择:选择一个FROM表1 如果table1为空,则不会返回任何行

平均选择:SELECT AVG(a)FROM table1
如果table1为空,我会返回< null>行。

4 个答案:

答案 0 :(得分:4)

来自ANSI 92规范

  

b)如果是AVG,MAX,MIN或SUM   指定,然后

          Case:

          i) If TXA is empty, then the result is the null value.

阅读详情:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

答案 1 :(得分:3)

我不是肯定的,但要确定平均值,你必须除以行数。如果行数为零,则除以它将是未定义的。因此,NULL返回。只是一个猜测。

答案 2 :(得分:1)

你正在做一个聚合。由于聚合被定义为0-n行(在这种情况下,0行产生null),因此总会得到一个结果(在这种情况下恰好是一个)。

换句话说,你不是要求表中的行 - 你要求表中一列的平均值,这就是你要回来的。在这种情况下获得除一行之外的任何东西都会更奇怪。

如果您曾要求提供非汇总列,例如

SELECT Salesperson, AVG(Sale)
FROM Sales
GROUP BY Salesperson

然后我希望你不会得到任何行,因为没有任何东西可以满足非聚合选择。

答案 3 :(得分:-1)

AVG是一个与COUNT类似的聚合函数。如果你这样做:

SELECT COUNT(a)FROM table1你希望得到一个零行。

与AVG,SUM等相同。您将获得具有聚合函数结果的一行。