|

Qual a Diferença entre COUNT(coluna) e COUNT(*) no SQL Server?

Compartilhe :

O COUNT é uma das funções de agregação mais usadas em SQL, mas a diferença entre COUNT(coluna) e COUNT(*) costuma gerar dúvida, principalmente quando a tabela tem valores nulos. Neste post você vai ver exatamente o que cada uma faz, com um exemplo prático, além de outras variações úteis do COUNT.

COUNT(coluna): conta apenas os valores não nulos

Quando você passa uma coluna específica para o COUNT, ele conta apenas as linhas em que aquela coluna não é nula. Valores NULL são ignorados na contagem.

Veja um exemplo na tabela WMTitulos, que tem uma coluna chamada Titulos:

SELECT COUNT(Titulos) FROM WMTitulos;

Resultado:

-----------
18

(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.

A tabela WMTitulos tem, na verdade, 19 linhas no total, mas uma delas tem o campo Titulos como NULL:

Titulos
--------------------------------------------------------------
But Is It User Friendly?
Computer Phobic AND Non-Phobic Individuals: Behavior Variations
Cooking with Computers: Surreptitious Balance Sheets
Emotional Security: A New Algorithm
Fifty Years in Buckingham Palace Kitchens
Is Anger the Enemy?
Life Without Fear
Net Etiquette
Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean
Prolonged Data Deprivation: Four Case Studies
Secrets of Silicon Valley
Silicon Valley Gastronomic Treats
Straight Talk About Computers
Sushi, Anyone?
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking
You Can Combat Computer Stress!
NULL

(19 row(s) affected)

Por isso COUNT(Titulos) retorna 18: a linha com NULL é descartada da contagem, e o SQL Server ainda emite um aviso informando que um valor nulo foi eliminado da agregação.

COUNT(*): conta todas as linhas, incluindo as com valores nulos

COUNT(*) não olha para o conteúdo de nenhuma coluna específica; ele simplesmente conta o número de linhas retornadas pela consulta, nulas ou não:

SELECT COUNT(*) FROM WMTitulos;

Resultado:

-----------
19

(1 row(s) affected)

Como a tabela tem 19 linhas ao todo (incluindo a que tem Titulos nulo), COUNT(*) retorna 19.

Contando apenas valores distintos: COUNT(DISTINCT coluna)

Se você quer saber quantos valores diferentes (sem repetição) uma coluna tem, use COUNT(DISTINCT coluna). Assim como COUNT(coluna), valores nulos também são ignorados:

SELECT COUNT(DISTINCT Titulos) FROM WMTitulos;

Contagem condicional com COUNT e CASE

Uma combinação bastante útil no dia a dia é usar COUNT junto com CASE para contar apenas as linhas que atendem a uma condição específica, sem precisar de várias consultas separadas. Por exemplo, para contar quantos títulos contêm a palavra “Computer”:

SELECT COUNT(CASE WHEN Titulos LIKE '%Computer%' THEN 1 END) AS TotalComputer
FROM WMTitulos;

Como o CASE retorna NULL para as linhas que não atendem à condição, e COUNT(coluna) ignora nulos, o resultado é a contagem apenas das linhas que satisfazem o WHEN.

Tabelas muito grandes: COUNT_BIG

Para tabelas com mais de aproximadamente 2,1 bilhões de linhas, o COUNT comum pode estourar o limite do tipo int. Nesses casos, use COUNT_BIG, que funciona exatamente como COUNT, mas retorna um bigint:

SELECT COUNT_BIG(*) FROM WMTitulos;

Conclusão

A regra prática é simples: COUNT(*) conta todas as linhas, COUNT(coluna) conta só as linhas em que aquela coluna não é nula. Use COUNT(*) quando quiser o total de registros da consulta, e COUNT(coluna) quando o que importa é saber quantos registros realmente têm valor preenchido naquele campo. Para valores únicos, combine com DISTINCT, e para contagens condicionais, combine com CASE.

Posts Similares