entre - sum as sql
En SQL, ¿cuál es la diferencia entre count(column) y count(*)? (10)
Básicamente, la función COUNT (*) devuelve todas las filas de una tabla, mientras que COUNT (COLUMN_NAME) no; es decir, excluye valores nulos que todos aquí también han respondido aquí. Pero la parte más interesante es optimizar las consultas y la base de datos; es mejor utilizar COUNT (*) a menos que realice varios recuentos o una consulta compleja en lugar de COUNT (COLUMN_NAME). De lo contrario, realmente reducirá el rendimiento de su BD al mismo tiempo que maneja una gran cantidad de datos.
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 reemplazo todas las llamadas para count(column_name)
para count(*)
?
Esta pregunta fue inspirada por ¿Cómo encuentro valores duplicados en una tabla en Oracle? .
Para aclarar la respuesta aceptada (y tal vez mi pregunta), reemplazar el count(column_name)
con count(*)
devolvería una fila adicional en el resultado que contiene un null
y el recuento de valores null
en la columna.
Como se mencionó en las respuestas anteriores, Count(*)
cuenta incluso las columnas NULL
, mientras que count(Columnname)
solo cuenta si la columna tiene valores.
Siempre es una buena práctica evitar *
( Select *
, count *
, ...)
La explicación en los docs ayuda a explicar esto:
COUNT (*) devuelve la cantidad de elementos en un grupo, incluidos valores NULL y duplicados.
COUNT (expresión) evalúa la expresión de cada fila en un grupo y devuelve la cantidad de valores no nulos.
Entonces count (*) incluye nulls, el otro método no.
Lo mejor es usar
Count(1) in place of column name or *
para contar el número de filas en una tabla, es más rápido que cualquier formato porque nunca va a verificar el nombre de la columna en la tabla existe o no
No hay diferencia si una columna es arreglo en su tabla, si desea usar más de una columna, debe especificar la cantidad de columnas que necesita para contar ...
Gracias,
Otra diferencia menor, entre usar * y una columna específica, es que en el caso de columna puede agregar la palabra clave DISTINCT y restringir el recuento a valores distintos:
select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;
Podemos usar Stack Exchange Data Explorer para ilustrar la diferencia con una simple consulta. La tabla Usuarios en la base de datos de tiene columnas que a menudo se dejan en blanco, como la URL del sitio web del usuario.
-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a ''not null'' column, and count(*)
select count(WebsiteUrl), count(Id), count(*) from Users
Si ejecuta la consulta anterior en el Explorador de datos , verá que el recuento es el mismo para el count(Id)
y el count(*)
porque la columna Id
no permite valores null
. Sin WebsiteUrl
recuento de WebsiteUrl
es mucho menor porque esa columna permite el null
.
Una diferencia adicional y quizás sutil es que, en algunas implementaciones de bases de datos, el recuento (*) se calcula al observar 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 preocuparse por 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 las filas "reales".
count(*)
cuenta NULLs y count(column)
no
[edit] agregó este código para que las personas puedan ejecutarlo
create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)
select count(*),count(id),count(id2)
from #bla
resultados 7 3 2
- La sentencia COUNT (*) indica que SQL Server devolverá todas las filas de una tabla, incluidos los NULL.
- COUNT (column_name) solo recupera las filas que tienen un valor no nulo en las filas.
Consulte el siguiente código para las ejecuciones de prueba SQL Server 2008:
-- Variable table
DECLARE @Table TABLE
(
CustomerId int NULL
, Name nvarchar(50) NULL
)
-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, ''Pedro'')
INSERT INTO @Table VALUES( 1, ''Juan'')
INSERT INTO @Table VALUES( 2, ''Pablo'')
INSERT INTO @Table VALUES( 3, ''Marcelo'')
INSERT INTO @Table VALUES( NULL, ''Leonardo'')
INSERT INTO @Table VALUES( 4, ''Ignacio'')
-- Get all the collumns by indicating *
SELECT COUNT(*) AS ''AllRowsCount''
FROM @Table
-- Get only content columns ( exluce NULLs )
SELECT COUNT(CustomerId) AS ''OnlyNotNullCounts''
FROM @Table