Всегда ли COUNT (*) возвращает результат? - PullRequest
31 голосов
/ 31 марта 2010

Если я запускаю запрос, такой как:

SELECT COUNT(*) as num FROM table WHERE x = 'y'

Будет ли он всегда возвращать результат, даже если запрос не соответствует ни одной записи? Или мне нужно проверить и убедиться, что в результате возвращается строка?

Ответы [ 7 ]

46 голосов
/ 31 марта 2010

Да, потому что это агрегат и возвращает ноль. Если вы не добавите GROUP BY, в этом случае нет результата, потому что нет группы ...

MAX / SUM и т. Д. Будет возвращать NULL, если только вы не добавите GROUP BY, а затем строк Только COUNT возвращает число без результатов

Изменить, немного поздно: SUM вернет NULL, как MAX

Edit, May 2013: это относится ко всем основным RDBMS. Я думаю, в соответствии со стандартом ANSI

8 голосов
/ 09 декабря 2011

Да, возвращаемое значение самой функции "count" всегда является ненулевым целым числом без исключения.

Сказав это, вы можете быть более заинтересованы в возвращениизначение вашего запроса , которое на самом деле является результирующим набором .Если это так, то вам просто нужно решить, включает ли ваш запрос предложение «group by».

A несгруппированный запрос с агрегатными функциями, такими как

select count(*), sum(*), max(*), min(*) from table

создает результирующий набор с единственной записью , содержащей возвращаемое значение (я) агрегатной функции (ей).В этом случае ваш результирующий набор всегда будет содержать ровно одну запись со столбцами, содержащими возвращаемые значения любых агрегатных функций, которые вы включили.В этой единственной записи возвращаемое значение count всегда будет ненулевым целым числом, в то время как возвращаемые значения других агрегатных функций, таких как min, max и sum, могут быть нулевыми.В приведенном выше примере возвращаемая запись может быть «ноль, ноль, ноль, ноль», но никогда не будет «ноль, ноль, ноль, ноль», поскольку count никогда не возвращает ноль.Таким образом, если вы вызываете только «count», то этот столбец в этой возвращаемой записи всегда будет содержать ненулевое возвращаемое значение count;следовательно, вы можете быть уверены, что скалярное возвращаемое значение вашего запроса подсчета всегда будет ненулевым целым числом.

С другой стороны, сгруппированный запрос с агрегатными функциями, такими как

select count(*), sum(*), max(*), min(*) from table group by column

создает набор результатов с нулем или более записей , где каждая запись содержит возвращаемое значение агрегатной функции (функций) для каждой идентифицированной группы.В этом случае, если не определены группы, нет групп для выполнения агрегатных функций, функции никогда не запускаются, и «возвращаемое значение запроса» будет пустым набором без записей вообще.

Протестируйте его на таблице без записей, чтобы увидеть результаты:

create table #t (c int);
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null}
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records
drop table #t;

Так что, независимо от того, звоните вы в счетчик, мин, макс или сумму, важно понимать не только возвратзначения отдельных агрегатных функций, а также «возвращаемое значение» самого запроса и что содержит этот результирующий набор.

5 голосов
/ 31 марта 2010

Агрегатная функция Count () всегда возвращает значение

2 голосов
/ 31 марта 2010

, если не найдено ни одной записи, счетчик вернет 0. (так что да, count всегда возвращает результат, если у вас нет синтаксической ошибки)

2 голосов
/ 31 марта 2010

Результат всегда будет выглядеть так:

| COUNT(*) |
------------
| 0        |

если совпадений нет.

Кстати, я бы предпочел считать только первичный ключ вместо *.

2 голосов
/ 31 марта 2010

Да, в таких случаях он вернет 0.

2 голосов
/ 31 марта 2010

Да, он всегда будет возвращать число

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