una tablas recomendaciones queries porque optimizador lento lenta las dañan cuello consulta consejos como botella agilizar mysql sql aggregate

recomendaciones - porque se dañan las tablas en mysql



¿COUNT(*) siempre devuelve un resultado? (7)

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 registro? ¿O debo validar y asegurarme de que se devuelva una fila como resultado?


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


Sí, devolverá 0 en tales casos.


Sí, devolverá un valor numérico siempre


Sí, el valor de retorno de la función "recuento" en sí mismo siempre es un entero no nulo, sin excepción.

Una vez dicho esto, puede estar más interesado en el valor de retorno de su consulta , que en realidad es un conjunto 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 conjunto de resultados con un solo registro que contiene los valores de retorno de la (s) función (es) agregada (s). En este caso, su conjunto de resultados siempre tendrá exactamente un registro, con columnas que contienen los valores de retorno de las funciones agregadas que haya incluido. Dentro de este registro solitario, el valor de retorno del conteo siempre será un entero 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 registro 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 registro 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 entero no nulo.

Por otro lado, una consulta agrupada con funciones agregadas como

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

produce un conjunto de resultados con cero o más registros donde cada registro contiene el valor de retorno de la (s) función (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 conjunto vacío sin registros.

Pruébalo en una mesa sin registros 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 conjunto de resultados.


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

MAX / SUM, etc. devolverá NULL a menos 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


Siempre habrá una fila de resultados como esta:

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

si no hay coincidencias

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


si no se coincide ningún registro, el recuento devolverá 0. (así que sí, el conteo siempre devuelve un resultado, a menos que tenga algún error de sintaxis)