2010-03-31 13 views
28

Si me quedo una consulta como:¿COUNT (*) siempre devuelve un resultado?

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

Será siempre devolver un resultado, aun cuando la consulta no coincide con ningún registro? ¿O debo validar y asegurarme de que se devuelva una fila como resultado?

+9

¿Es demasiado difícil de probar? –

+0

@col yea :) ',' –

+1

@col al no intentarlo y solo seguirlo aquí, supongo que quiere que los espectadores hagan clic en "Volar a la deriva" para sus preguntas. – raj

Respuesta

42

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

MAX/SUM, etc. devolverá NULL a menos que agregue GROUP BY y luego no filas. Sólo COUNT devuelve un número de resultados no

Editar, un poco tarde: SUMA devolvería NULL como Max

edición, mayo de 2013: esto se aplica a todos los RDBMS principal. Supongo según el estándar ANSI

+0

Dice que puedo aceptar en 11 minutos, wtf ... –

+0

¿Qué pasa con funciones como SUM(), devolverían 0 o NULL? –

+2

@Click Voto ascendente: lo siento, no respondí. SUM da NULL como MAX. Solo COUNT devuelve 0 – gbn

2

Sí, va a devolver un valor numérico siempre

5

Conde función Agregado() siempre devuelve el valor

+3

... a menos que agregue GROUP BY? – gbn

+1

... para aclarar: El "valor de retorno de la función 'contar'" es SIEMPRE un entero no nulo, sin excepción. Al mencionar "agrupar por", hace referencia a la consulta que contiene y cambia el asunto de "valor de retorno" de "función de conteo" a "conjunto de resultados de la consulta". Una consulta de recuento no agrupada produce un conjunto de resultados de un registro único que contiene el valor de retorno de recuento. Alternativamente, una consulta de conteo agrupado produce un conjunto de resultados donde cada registro contiene un valor de conteo. En ese caso, si no hay grupos para que se ejecute el recuento, el recuento nunca se ejecuta y el "valor de retorno de la consulta" es un conjunto vacío. – Triynko

2

Sí, va a devolver 0 en tales casos.

2

Siempre habrá una fila de resultado como este:

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

si no hay coincidencias.

Por cierto, yo preferiría contar sólo la clave principal en lugar de *.

+2

'COUNT (*)' no es lo mismo que 'COUNT (columna)' en general. Contar una columna verifica valores distintos, no todos los registros. De acuerdo, cuando cuentes tu clave principal obtendrás todos los registros porque las claves primarias deben ser únicas, pero esto no será más rápido que 'COUNT (*)' y podría ser más lento (a menos que MySQL optimice automáticamente de nuevo a 'COUNT (*) '). –

+3

@Ty W - "Contando una columna verifica valores distintos". No, esto no es cierto a menos que especifique la palabra clave 'distinct'. Cuenta valores que no son 'NULL' –

2

si ningún registro se corresponde con la cuenta volverá 0. (así que sí, cuente siempre devuelve un resultado, a menos que tenga algún error de sintaxis)

7

Sí, el valor retorno de la función "conteo" sí es siempre un número entero no nulo, sin excepción.

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

A consulta no agrupados con funciones de agregado como

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

produce un conjunto de resultados con un único registro de que contiene el valor (s) de retorno de la función (s) agregada. 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 disco en solitario, el valor de retorno de recuento será siempre un número entero no nulo, mientras que los valores de retorno de las otras funciones de agregado, como mínimo, máximo, y la suma puede ser nulo. En el ejemplo anterior, el registro devuelto puede ser "cero, null, null, null", pero nunca será "null, null, null, null", ya que la cuenta nunca se devuelve un valor nulo. Así que si usted está llamando única "recuento", luego de que una columna en que un registro devuelto siempre contendrá el valor de retorno no nulo de 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 agrupados con funciones de agregado como

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

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

probarlo en una tabla 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; 

no tan si usted está llamando recuento, mínimo, máximo, o suma, es importante entender únicamente los valores de retorno de funciones de agregado individuales, sino también el "valor de retorno" de la consulta en sí, y lo que contiene ese conjunto de resultados.

+0

¡Gracias! Solo quería que sepas que en MySQL no pude ejecutar 'SUM (*)'. – CMCDragonkai

Cuestiones relacionadas