Tengo la siguiente consulta:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
¿Cuál sería la diferencia si reemplazara todas las llamadas count(column_name)
a count(*)
?
Esta pregunta se inspiró en ¿Cómo encuentro valores duplicados en una tabla en Oracle? .
Para aclarar la respuesta aceptada (y tal vez mi pregunta), reemplazar count(column_name)
con count(*)
devolvería una fila adicional en el resultado que contiene null
ay el recuento de null
valores en la columna.
Otra diferencia menor, entre usar * y una columna específica, es que en el caso de la columna puede agregar la palabra clave DISTINCT y restringir el conteo a valores distintos:
fuente
Una diferencia adicional y quizás sutil es que en algunas implementaciones de bases de datos el recuento (*) se calcula mirando los índices en la tabla en cuestión en lugar de las filas de datos reales. Como no se especifica una columna específica, no hay necesidad de molestarse con las filas reales y sus valores (como lo sería si contara una columna específica). Permitir que la base de datos use los datos del índice puede ser significativamente más rápido que hacer que cuente filas "reales".
fuente
La explicación en los documentos ayuda a explicar esto:
Entonces count (*) incluye valores nulos, el otro método no.
fuente
Podemos usar el Explorador de datos de Stack Exchange para ilustrar la diferencia con una consulta simple. La tabla Usuarios en la base de datos de Stack Overflow tiene columnas que a menudo se dejan en blanco, como la URL del sitio web del usuario.
Si ejecuta la consulta anterior en el Explorador de datos , verá que el recuento es el mismo para
count(Id)
ycount(*)
porque laId
columna no permitenull
valores. SinWebsiteUrl
embargo, el recuento es mucho más bajo porque esa columna lo permitenull
.fuente
Básicamente, la
COUNT(*)
función devuelve todas las filas de una tabla, mientrasCOUNT(COLUMN_NAME)
que no; es decir, excluye valores nulos que todos aquí también han respondido aquí. Pero la parte más interesante es que las consultas y la base de datos optimizada es mejor usar aCOUNT(*)
menos que haga múltiples conteos o una consulta compleja en lugar de hacerloCOUNT(COLUMN_NAME)
. De lo contrario, realmente reducirá el rendimiento de su base de datos al tratar con una gran cantidad de datos.fuente
Consulte el siguiente código para las ejecuciones de prueba de SQL Server 2008:
fuente
COUNT(*)
- Devuelve el número total de registros en una tabla (incluidos los registros con valores NULL).COUNT(Column Name)
- Devuelve el número total de registros no NULL. Significa que, ignora contar registros con valores NULL en esa columna en particular.fuente
Es mejor usar
para contar el número de filas en una tabla, es más rápido que cualquier formato porque nunca va a verificar si el nombre de la columna en la tabla existe o no
fuente
COUNT(*)
en comparación conCOUNT(columnName)
no irá a verificar el valor de la columna, porque solo enumera las filas. ¡PeroCOUNT(columnName)
es más lento incluso elcount
aplicado en unaid
columna! Al menos en SQL Server, por supuesto.No hay diferencia si una columna está arreglada en su tabla, si desea usar más de una columna de lo que tiene que especificar cuántas columnas necesita contar ...
Gracias,
fuente
Como se mencionó en las respuestas anteriores,
Count(*)
cuenta incluso lasNULL
columnas, mientras quecount(Columnname)
cuenta solo si la columna tiene valores.Siempre es mejor práctica para evitar
*
(Select *
,count *
, ...)fuente
COUNT(*)