Eu tenho a seguinte consulta:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
Qual seria a diferença se eu substituísse todas as chamadas count(column_name)
para count(*)
?
Esta pergunta foi inspirada em Como encontro valores duplicados em uma tabela no Oracle? .
Para esclarecer a resposta aceita (e talvez minha pergunta), a substituição count(column_name)
por count(*)
retornaria uma linha extra no resultado que contém null
ae a contagem de null
valores na coluna.
Outra diferença menor, entre usar * e uma coluna específica, é que, no caso da coluna, você pode adicionar a palavra-chave DISTINCT e restringir a contagem a valores distintos:
fonte
Uma diferença adicional e talvez sutil é que, em algumas implementações de banco de dados, a contagem (*) é calculada observando os índices na tabela em questão, e não as linhas de dados reais. Como nenhuma coluna específica é especificada, não há necessidade de se preocupar com as linhas reais e seus valores (como seria se você contasse uma coluna específica). Permitir que o banco de dados use os dados do índice pode ser significativamente mais rápido do que fazê-lo contar linhas "reais".
fonte
A explicação nos documentos ajuda a explicar isso:
Portanto, count (*) inclui valores nulos, o outro método não.
fonte
Podemos usar o Stack Exchange Data Explorer para ilustrar a diferença com uma simples consulta. A tabela Usuários no banco de dados do Stack Overflow possui colunas que geralmente são deixadas em branco, como o URL do site do usuário.
Se você executar a consulta acima no Data Explorer , verá que a contagem é a mesma
count(Id)
ecount(*)
porque aId
coluna não permitenull
valores. AWebsiteUrl
contagem é muito menor, no entanto, porque essa coluna permitenull
.fonte
Basicamente, a
COUNT(*)
função retorna todas as linhas de uma tabela, enquantoCOUNT(COLUMN_NAME)
isso não ocorre; isto é, exclui valores nulos que todos aqui também responderam aqui. Mas a parte mais interessante é tornar as consultas e o banco de dados otimizados; é melhor usá-COUNT(*)
lo, a menos que faça várias contagens ou uma consulta complexa em vez deCOUNT(COLUMN_NAME)
. Caso contrário, ele realmente diminuirá o desempenho do seu banco de dados enquanto lida com um grande número de dados.fonte
Consulte o código a seguir para execuções de teste do SQL Server 2008:
fonte
COUNT(*)
- Retorna o número total de registros em uma tabela (incluindo registros com valor NULL).COUNT(Column Name)
- Retorna o número total de registros não nulos. Isso significa que ignora a contagem de registros com valor NULL nessa coluna específica.fonte
É melhor usar
para contar o número de linhas em uma tabela, é mais rápido do que qualquer formato, pois nunca verifica o nome da coluna na tabela existente ou não
fonte
COUNT(*)
em comparação comCOUNT(columnName)
não irá verificar o valor da coluna, porque apenas enumera linhas. MasCOUNT(columnName)
é mais lento, mesmo ocount
aplicado em umaid
coluna! Pelo menos no SQL Server, é claro.Não há diferença se uma coluna for corrigida em sua tabela, se você quiser usar mais de uma coluna do que precisar especificar quantas colunas você precisa contar ......
Obrigado,
fonte
Conforme mencionado nas respostas anteriores,
Count(*)
conta mesmo asNULL
colunas, enquantocount(Columnname)
conta apenas se a coluna tiver valores.É sempre melhor prática para evitar
*
(Select *
,count *
...)fonte
COUNT(*)