select count(*), count(1) e count(nome): a batalha dos counts de SQL

Quantos produtos tem minha empresa mesmo?

select count(nome) from Produtos;
> 198

Mas…

select count(id) from Produtos;
> 200

Como assim? SQL pirou? De novo?

select id, nome from Produtos where nome is null;
> 190, null
> 196, null

Tã dã!!! O select count verifica o número de linhas não nulas dentro do count que você quer fazer! Se tinha nome nulo, não contou! Resultado? Zoou.

Muito cuidado com seus counts. Então o que devo contar? Se você quer contar valores não nulos, use o count(campo), como fizemos:

select count(nome) from Produtos;
> 198

Mas se quer contar todos, count estrela nele pra não correr risco, ele vai contar o número de registros retornados, independentemente de valores nulos:

select count(*) from Produtos;
> 200

E o bambu? Digo, e o 1? Pra que o count(1)?

select count(1) from Produtos;
> 200

O count(1) seria uma alternativa ao count(algum_campo) pois você teria certeza que nunca seria nulo, e que não precisaria ler o campo… acontece que fica bizarro select count(1), e você quer ter código bizarro ou código legível?

Como disse, eu prefiro contar estrelas… e você, conta estrelas conta um ou conta id?

ps: Boa prática sugerida pelo dev do Alura, Caio Incau!
Fica agora o desafio: qual o resultado da SQL a seguir?

select count(nome) from Produtos where nome is null;
> ??????

Responda já! Tô esperando.

Outras pegadinhas de count? Conta aí!

Gostou dessas práticas e dicas de SQL? Que tal receber conteúdos de tecnologia assim como essas dicas que escrevi? É mais simples do que parece, basta assinar a nossa newsletter! 😉

Fique por dentro

(Última atualização em: 17 de fevereiro de 2017)

Tech Education Leader no Alura

  • Maicon

    Como contar o vazio? 😛

    • Ótima pergunta Maicon! Transformei ela em dica e coloquei na lista, o que acha?

      select sum(if(nome is null, 1, 0)) as sem_titulos from Produtos;

      E como contar quantos estão vazios e quantos preenchidos?

  • José Carlos

    2.
    Parabéns pelas dicas, bom que já começo aprendendo as coisas de maneiras certas.

  • Eu sempre “conto” pela chave primária, pois além de evitar o cálculo errado por causa da escola estar nula, ainda tem a questão do desempenho.

  • Edmar Müller

    Artigo simples e direto. Melhor explicação que vi sobre o assunto.

  • Sidnei Carneiro

    Belo texto mas não concordo com count(1) ser bizarro, bizarro é uma questão de gosto eu já acho chamar o asterisco de estrela bizarro mas é como eu disse questão de opinião…

    • Com certeza Sidnei… o bizarro na minha visão é que “*” já seria algo aceitado por ser o caracter que representa “qualquer coisa”, enquanto o número 1 não significar nada de especial… concordo que fica subjetivo.

  • Luiz

    select count(nome) from Produtos where nome is null; => 0

    2 registros entram no where, mas o count nao computa nome=null

  • Thiago Colebrusco

    Contar com * não tem um desempenho pior que contar com a chave primária?

    • Vai depender da implementação de cada banco, mas pode assumir que em regra geral todos sabem que se é count(*) é contar o número de registros, e não os valores deles.

  • Elói Martins

    Quanto ao count(*) e count(1) dependerá de qual SGBD que esteja trabalhando. No MSSQL não tem diferença, porém, no mySql tem uma pequena diferença de performance sim, principalmente dependendo de como a tabela foi criada, InnoDB ou MyIsam. Se tiver PK prefiro contar pela PK, senão, pelo count(1).

  • Felipe Montoan

    Usei a dica no meu trabalho hoje!!! Valeu

  • edvaldo

    Gostei das observações colocadas sobre a clausula count. Estou ansioso pelas próximas dicas…
    Obrigado

  • Everaldo

    Como faço para usar o count e apresentar o resultado da quantidade por dia e por cliente?

    • select id_cliente,dia,count(1) as quant_dia from tabela group by id_cliente,dia

Próximo ArtigoCentralizando um elemento com CSS