sqlite SELECT AVG возвращает ноль - PullRequest
0 голосов
/ 14 июля 2009

Кто-нибудь знает, почему запрос SQL SELECT не возвращает строк при SELECT из пустой таблицы, но при попытке выбрать AVG из столбца в пустой таблице он возвращает ? Разница в поведении мне кажется странной. Я использую базу данных sqlite, если это что-то меняет.

Вот два запроса:

Обычный выбор: ВЫБРАТЬ ИЗ таблицы1
Если table1 пусто, я не получаю строк назад

Avg select: ВЫБРАТЬ AVG (a) ИЗ таблицы1
Если table1 пусто, я возвращаю строку .

Ответы [ 4 ]

4 голосов
/ 14 июля 2009

Из спецификации 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

3 голосов
/ 14 июля 2009

Я не уверен, но чтобы определить среднее значение, вы должны разделить на количество строк. Если число строк равно нулю, деление на него будет неопределенным. Таким образом, возвращается NULL. Просто предположение.

1 голос
/ 14 июля 2009

Вы делаете совокупность. Поскольку агрегат определен для 0-n строк (в этом случае 0 строк возвращает ноль), вы всегда получите один результат обратно (в данном случае ровно один).

Другими словами, вы не запрашиваете строки в таблице - вы запрашиваете среднее значение для одного столбца в таблице, и это то, что вы получаете. Получение чего-либо кроме одной строки в этом случае было бы страннее.

Если вы также запрашивали неагрегированные столбцы, например,

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

тогда я бы ожидал, что вы не получите никаких строк назад, потому что не будет ничего, чтобы удовлетворить неагрегированные выборки.

0 голосов
/ 14 июля 2009

AVG - агрегатная функция, аналогичная COUNT. Если вы делаете:

ВЫБЕРИТЕ СЧЕТЧИК (a) ИЗ таблицы1 вы ожидаете получить нулевую строку.

то же самое с AVG, SUM и т. Д. Вы получаете одну строку с результатом функции агрегирования.

...