COUNT(*) ou COUNT(coluna)? Como o SQL conta linhas e valores nulos

COUNT(*) ou COUNT(coluna)? Como o SQL conta linhas e valores nulos

Uma tabela tem 3 linhas, mas a contagem deu 2. Não é erro do banco de dados: é a diferença entre contar linhas e contar valores não nulos.

O exemplo

Considere a tabela fictícia notas, com uma coluna nota:

alunonota
Ana10
Bia20
CaioNULL

Segundo a documentação do PostgreSQL, o valor nulo representa um valor desconhecido. No exemplo, a nota de Caio não foi registrada.

COUNT(*) conta linhas

SELECT COUNT(*) FROM notas;
-- resultado: 3

Segundo a documentação do PostgreSQL, count(*) calcula o número de linhas de entrada. Todas as linhas entram, com ou sem valores nulos.

COUNT(coluna) conta valores não nulos

SELECT COUNT(nota) FROM notas;
-- resultado: 2

A mesma documentação diz que count(expressão) conta as linhas em que o valor de entrada não é nulo. A linha de Caio fica de fora. A documentação do SQL Server (Microsoft) descreve o mesmo comportamento: COUNT(expressão) retorna o número de valores não nulos.

Zero não é NULL

Se a nota de Caio fosse 0, COUNT(nota) daria 3. Zero é um valor conhecido; NULL representa um valor desconhecido. Confundir os dois muda o resultado de contagens e de médias. Pela mesma razão, para testar nulos use IS NULL, e não = NULL.

O efeito no AVG

A documentação do PostgreSQL explica que a maioria das funções de agregação ignora entradas nulas. Por isso:

SELECT AVG(nota) FROM notas;
-- resultado: 15

A média considera só 10 e 20: (10 + 20) ÷ 2 = 15. Se o objetivo fosse tratar a nota ausente como zero, seria preciso dizer isso explicitamente, por exemplo com COALESCE(nota, 0), e aí a média seria 10.

Checklist para questões

  • O argumento é * ou uma coluna? Linhas ou valores não nulos?
  • Há WHERE antes da contagem? Ele reduz as linhas de entrada.
  • Há NULL na coluna? Ele sai de COUNT(coluna), AVG, SUM, MIN e MAX.
  • Há GROUP BY? A contagem passa a ser feita por grupo.

Resumo para revisão

  • COUNT(*): número de linhas.
  • COUNT(coluna): número de linhas com valor não nulo naquela coluna.
  • A maioria das funções de agregação, como AVG e SUM, ignora NULL.
  • 0 é um valor conhecido; NULL representa um valor desconhecido.

Fontes

Acompanhe a GratLabs Concursos

Quer mais revisões curtas como esta? Siga a GratLabs Concursos no Instagram, em @gratlabs.concursos, e no YouTube, no canal GratLabs Concursos.

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *