O COUNT (*) sempre retorna um resultado?

Se eu executar uma consulta como:

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

Será que sempre retornará um resultado, mesmo quando a consulta não corresponder a nenhum registro? Ou preciso validar e garantir que uma linha seja retornada como resultado?

Sim, porque é um agregado e retorna zero. A menos que você adicione GROUP BY, nesse caso, nenhum resultado, porque não há nenhum grupo …

MAX / SUM etc retornariam NULL, a menos que você incluísse GROUP BY e não houvesse registros. Somente COUNT retorna um número sem resultados

Editar, um pouco atrasado: SUM retornaria NULL como MAX

Editar, maio de 2013: isso se aplica a todos os principais RDBMS. Eu acho que de acordo com o padrão ANSI

Sim, o valor de retorno da function “count” em si é sempre um inteiro não nulo, sem exceção.

Dito isto, você pode estar mais interessado no valor de retorno da sua consulta , que é na verdade um conjunto de resultados . Se for esse o caso, basta considerar se sua consulta inclui uma cláusula “agrupar por”.

Uma consulta não agrupada com funções agregadas como

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

produz um conjunto de resultados com um único registro contendo o (s) valor (es) de retorno da (s) function (ões) agregada (s). Nesse caso, seu conjunto de resultados sempre terá exatamente um registro, com colunas contendo os valores de retorno de todas as funções agregadas que você incluiu. Dentro desse registro solitário, o valor de retorno da contagem sempre será um inteiro não nulo, enquanto os valores de retorno das outras funções agregadas, como min, max e sum, podem ser nulos. No exemplo acima, seu registro retornado pode ser “zero, nulo, nulo, nulo”, mas nunca será “nulo, nulo, nulo, nulo”, já que count nunca retorna nulo. Portanto, se você estiver chamando apenas “count”, então, uma coluna nesse registro retornará sempre o valor de retorno não nulo de count; Portanto, você pode ter certeza de que o valor de retorno escalar de sua consulta de contagem sempre será um inteiro não nulo.

Por outro lado, uma consulta agrupada com funções agregadas como

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

produz um conjunto de resultados com zero ou mais registros, em que cada registro contém o valor de retorno da (s) function (ões) agregada (s) para cada grupo identificado. Nesse caso, se não houver grupos identificados, não haverá grupos para que as funções de agregação sejam executadas, as funções nunca serão executadas e o “valor de retorno da consulta” será um conjunto vazio sem nenhum registro.

Teste em uma tabela sem registros para ver os resultados:

 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; 

Portanto, esteja você chamando count, min, max ou sum, é importante entender não apenas os valores de retorno de funções agregadas individuais, mas também o “valor de retorno” da consulta em si e o que esse conjunto de resultados contém.

A function agregada Count () sempre retorna o valor

Sim, ele retornará um numérico sempre

Sim, retornará 0 em tais casos.

Sempre haverá uma linha de resultado como esta:

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

se não houver correspondências.

A propósito, prefiro contar apenas a chave primária em vez de * .

se nenhum registro for correspondido, a contagem retornará 0. (então sim, count sempre retorna um resultado, a menos que você tenha algum erro de syntax)