有谁知道为什么 SQL SELECT 查询在从空表中 SELECT 时不返回任何行,但是当尝试从空表中的列中选择 AVG 时它返回 < null >?行为上的差异对我来说似乎很奇怪。如果这有什么不同,我正在使用 sqlite 数据库。
这是两个查询:
正常选择: SELECT a FROM table1
如果 table1 为空,我没有返回任何行
Avg select: SELECT AVG(a) FROM table1
如果 table1 为空,我会返回 < null > 行。
来自 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
我不是肯定的,但要确定平均值,您必须除以行数。如果行数为零,则除以它是未定义的。因此,NULL 返回。只是一个猜测。
你正在做一个聚合。由于聚合是为 0-n 行定义的(在这种情况下,0 行会产生空值),因此您将始终得到一个结果(在这种情况下正好是一个)。
换句话说,您不是在询问表格中的行——您是在询问表格中一列的平均值,这就是您要返回的内容。在这种情况下得到除一行以外的任何东西都会更奇怪。
如果您也要求提供非聚合列,例如
SELECT Salesperson, AVG(Sale)
FROM Sales
GROUP BY Salesperson
那么我希望您不会返回任何行,因为没有任何东西可以满足非聚合选择。
AVG 是一个类似于 COUNT 的聚合函数。如果你这样做:
SELECT COUNT(a) FROM table1 你希望得到一个零行。
它与 AVG、SUM 等相同。您将获得带有聚合函数结果的一行。