2012-01-10 9 views
6

Me gustaría saber cuáles son las diferencias entre el uso:diferencia entre la cuenta (*) y el recuento (columnName)

SELECT email, COUNT(email) AS total 
FROM `newsletter` 
GROUP BY email having total>1 

o

SELECT count(*) as total, email 
FROM 'newsletter' 
GROUP BY email having total > 1 

Ambos dan los mismos resultados, pero lo que más está contando count(*) que los correos electrónicos?

+0

Consulte http://dba.stackexchange.com/q/2511/630 explica en relación con la norma ANSI – gbn

+1

posible duplicado de [En SQL, ¿cuál es la diferencia entre count (column) y count (*)?] (http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn-and-count) y muchos otros – gbn

Respuesta

5

Hay al menos una diferencia.

  • Pueden devolver resultados diferentes si email puede contener NULL.

Para obtener más información, vea this article.

+0

+1 para el enlace, pero ¿por qué crees que ese conteo (email) no puede usar los índices de cobertura? – newtover

+0

@newtover: No sabía nada de eso, pero Peter lo dice, y él sabe mucho más que yo :-) –

+0

Peter dice que solo necesitará otro índice para la consulta que describe, que aunque no es el caso para la consulta del OP. – newtover

2

COUNT (*) cuenta todas las filas POR CUANTO COUNT (nombre de columna) cuenta solamente valores no NULL.

1

SELECT COUNT(*) recuentos de todas las filas

SELECT COUNT(email) recuentos de todos los valores (valores no nulos)

En su caso, si todas las filas contienen valores, ambos resultados pueden ser el mismo. Pero puede hacer una diferencia en el rendimiento, pero esto depende del volumne de la tabla, el motor de almacenamiento, los índices ...

2

count(*) permite a la base de datos usar un índice para contar, por lo que puede mejorar el rendimiento. como usted ha dicho, el resultado es el mismo en la mayoría de los casos, pero:

  • count(column) solamente las cuentas que no son nulos hileras

por lo que en colusión: si tiene que perder el tiempo con valores nulos, use count(column); de lo contrario, use count(*) para un mejor rendimiento.

Cuestiones relacionadas