0

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

这是两个查询:

正常选择: SELECT a FROM table1
如果 table1 为空,我没有返回任何行

Avg select: SELECT AVG(a) FROM table1
如果 table1 为空,我会返回 < null > 行。

4

4 回答 4

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

于 2009-07-14T00:18:08.487 回答
3

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

于 2009-07-14T00:10:53.653 回答
1

你正在做一个聚合。由于聚合是为 0-n 行定义的(在这种情况下,0 行会产生空值),因此您将始终得到一个结果(在这种情况下正好是一个)。

换句话说,您不是在询问表格中的行——您是在询问表格中一列的平均值,这就是您要返回的内容。在这种情况下得到除一行以外的任何东西都会更奇怪。

如果您也要求提供非聚合列,例如

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

那么我希望您不会返回任何行,因为没有任何东西可以满足非聚合选择。

于 2009-07-14T00:13:59.203 回答
-1

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

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

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

于 2009-07-14T00:19:37.397 回答