¿COUNT (*) siempre devuelve un resultado?

Si ejecuto una consulta como:

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

¿Siempre devolverá un resultado, incluso cuando la consulta no coincida con ningún logging? ¿O debo validar y asegurarme de que se devuelva una fila como resultado?

Sí, porque es un agregado y devuelve cero. A less que agregue GROUP BY en cuyo caso no hay resultado porque no hay un grupo …

MAX / SUM, etc. devolverá NULL a less que agregue GROUP BY y luego no filas. Solo COUNT devuelve un número sin resultados

Editar, un poco tarde: SUM devolverá NULL como MAX

Editar, mayo de 2013: esto se aplica a todos los RDBMS principales. Supongo que según el estándar ANSI

Sí, el valor de retorno de la function "recuento" en sí mismo siempre es un integer no nulo, sin exception.

Una vez dicho esto, puede estar más interesado en el valor de retorno de su consulta , que en realidad es un set de resultados . Si ese es el caso, entonces simplemente debe considerar si su consulta incluye una cláusula "agrupar por".

Una consulta no agrupada con funciones agregadas como

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

produce un set de resultados con un solo logging que contiene los valores de retorno de la (s) function (es) agregada (s). En este caso, su set de resultados siempre tendrá exactamente un logging, con columnas que contienen los valores de retorno de las funciones agregadas que haya incluido. Dentro de este logging solitario, el valor de retorno del conteo siempre será un integer no nulo, mientras que los valores de retorno de las otras funciones agregadas, como min, max y sum, pueden ser nulos. En el ejemplo anterior, su logging devuelto puede ser "cero, nulo, nulo, nulo", pero nunca será "nulo, nulo, nulo, nulo", ya que el recuento nunca devuelve nulo. Por lo tanto, si llama solo "recuento", esa columna en ese logging devuelto siempre contendrá el valor de retorno no nulo del recuento; por lo tanto, puede estar seguro de que el valor de retorno escalar de su consulta de recuento siempre será un integer no nulo.

Por otro lado, una consulta agrupada con funciones agregadas como

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

produce un set de resultados con cero o más loggings donde cada logging contiene el valor de retorno de la (s) function (es) agregada (s) para cada grupo identificado. En este caso, si no hay grupos identificados, no hay grupos para ejecutar las funciones agregadas, las funciones nunca se ejecutan y el "valor de retorno de la consulta" será un set vacío sin loggings.

Pruébalo en una table sin loggings para ver los 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; 

Entonces, ya sea que esté llamando a count, min, max o sum, es importante comprender no solo los valores de retorno de las funciones agregadas individuales, sino también el "valor de retorno" de la consulta en sí, y qué contiene ese set de resultados.

Función de agregación El recuento () siempre devuelve valor

Sí, devolverá un valor numérico siempre

Sí, devolverá 0 en tales casos.

Siempre habrá una fila de resultados como esta:

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

si no hay coincidencias

Por cierto, preferiría contar solo la key principal en lugar de * .

si no se coincide ningún logging, el recuento devolverá 0. (entonces sí, el recuento siempre arroja un resultado, a less que tenga algún error de syntax)