有人知道为什么SQL SELECT查询在从空表中选择时不返回任何行,但是当尝试从空表中的列中选择AVG时,它返回< null>?行为上的差异对我来说似乎很奇怪。我正在使用sqlite数据库,如果这有任何区别。
以下是两个查询:
正常选择:选择一个FROM表1 如果table1为空,则不会返回任何行
平均选择:SELECT AVG(a)FROM table1
如果table1为空,我会返回< null>行。
答案 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等相同。您将获得具有聚合函数结果的一行。