A função COUNT() é uma das funções agregadoras mais populares e úteis no SQL. O objetivo principal dela é contar o número de linhas no resultado da query. Se a função COUNT() fosse um super-herói no mundo do SQL, o superpoder dela seria achar rapidinho respostas pra perguntas tipo:
- Quantos funcionários trabalham na empresa?
- Quantos estudantes tem em cada faculdade?
- Quantos produtos foram vendidos no último mês?
A sintaxe do COUNT() é bem simples:
COUNT(coluna)
onde coluna é o nome da coluna cujas linhas vão ser contadas. Mas tem outros jeitos de usar também, que a gente vai ver já já nessa aula.
Bora começar pelo uso mais básico do COUNT().
Variação 1: Contando todas as linhas com COUNT(*)
Quando você quer contar cada linha da tabela, não importa se tem dado ou não, usa COUNT(*). O asterisco significa "todas as colunas".
Exemplo: Temos uma tabela students com esse conteúdo:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Vamos rodar essa query:
SELECT COUNT(*)
FROM students;
Resultado:
| count |
|---|
| 4 |
A função COUNT(*) não liga pra valores NULL em colunas individuais, porque ela só conta o número de linhas na tabela.
Variação 2: Contando linhas com valores existentes na coluna COUNT(coluna)
Mas e se a gente quiser contar só as linhas onde tem valor diferente de NULL numa coluna específica? Aí usa COUNT(coluna).
Exemplo: vamos contar quantos estudantes têm nome preenchido.
SELECT COUNT(name)
FROM students;
Resultado:
| count |
|---|
| 3 |
Percebeu a diferença? Tem 4 linhas na tabela, mas em uma delas a coluna name tá com valor NULL. A função COUNT(coluna) ignora as linhas onde o valor da coluna é NULL.
Comparando COUNT(*) e COUNT(coluna)
Então, qual é a real diferença entre esses dois jeitos de usar a função: COUNT(*) e COUNT(coluna)?
COUNT(*)conta todas as linhas da tabela, incluindo as linhas comNULLem qualquer coluna.COUNT(coluna)conta só as linhas onde o valor da coluna indicada não é NULL.
Tabela de exemplo:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Queries:
-- Conta todas as linhas.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (todas as linhas)
-- Conta só as linhas onde o nome não é NULL.
SELECT COUNT(name) FROM students; -- 3 -- Conta linhas com nome preenchido
-- Conta só as linhas onde a idade não é NULL.
SELECT COUNT(age) FROM students; -- 3 -- Conta linhas com idade preenchida
Variação 3: Contando valores únicos com COUNT(DISTINCT coluna)
Às vezes você quer contar só os valores únicos numa coluna. Por exemplo, queremos saber quantas idades diferentes tem entre os estudantes. Pra isso serve o COUNT(DISTINCT coluna).
Exemplo:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Resultado:
| count |
|---|
| 3 |
Repara que nesse caso o DISTINCT ignora não só os duplicados, mas também os valores NULL.
Se você tentar usar DISTINCT junto com COUNT(*), vai dar erro: DISTINCT só pode ser usado com colunas específicas.
Exemplos de uso do COUNT() em situações reais
Exemplo 1. Contando o número de estudantes
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Resultado:
| total_students |
|---|
| 4 |
Exemplo 2. Contando estudantes com idade conhecida
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Resultado:
| students_with_age |
|---|
| 3 |
Exemplo 3. Contando idades únicas
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Resultado:
| unique_ages |
|---|
| 2 |
Erros comuns ao usar COUNT()
Achar que COUNT(coluna) vai contar todas as linhas, mesmo se tiver NULL.
Isso não é verdade: COUNT(coluna) ignora as linhas onde a coluna tá com NULL.
Usar COUNT(*) pra contar valores únicos.
Pra isso, usa COUNT(DISTINCT coluna).
Esquecer de filtrar os dados antes de contar.
Por exemplo:
SELECT COUNT(*) FROM students WHERE age > 20;
Aqui você vai pegar só os estudantes com mais de 20 anos, porque o WHERE já filtra as linhas antes de contar.
Esses detalhes costumam causar erros lógicos nas queries. Fica ligado!
GO TO FULL VERSION