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:
| aluno | nota |
|---|---|
| Ana | 10 |
| Bia | 20 |
| Caio | NULL |
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á
WHEREantes da contagem? Ele reduz as linhas de entrada. - Há
NULLna coluna? Ele sai deCOUNT(coluna),AVG,SUM,MINeMAX. - 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
AVGeSUM, ignoraNULL. - 0 é um valor conhecido;
NULLrepresenta um valor desconhecido.
Fontes
- PostgreSQL 18 Documentation – 9.21 Aggregate Functions. PostgreSQL Global Development Group. Data do documento: versão 18.6 (current em 25/09/2026). Disponível em: https://www.postgresql.org/docs/current/functions-aggregate.html. Acesso em 25/09/2026.
- PostgreSQL 18 Documentation – 4.2.7 Aggregate Expressions. PostgreSQL Global Development Group. Data do documento: versão 18.6. Disponível em: https://www.postgresql.org/docs/current/sql-expressions.html. Acesso em 25/09/2026.
- PostgreSQL 18 Documentation – 9.2 Comparison Functions and Operators. PostgreSQL Global Development Group. Data do documento: versão 18.6 (current em 25/09/2026). Disponível em: https://www.postgresql.org/docs/current/functions-comparison.html. Acesso em 25/09/2026.
- COUNT (Transact-SQL). Microsoft Learn. Data do documento: atualizado em 2026-09-21. Disponível em: https://learn.microsoft.com/en-us/sql/t-sql/functions/count-transact-sql. Acesso em 25/09/2026.
- Os exemplos numéricos identificados como fictícios foram elaborados pela GratLabs; os cálculos podem ser conferidos no próprio texto.
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.

Deixe um comentário