Como contar ocorrências e encontrar informações redundantes no MySQL

A função COUNT() pode ser usada para encontrar dados redundantes ou determinar a quantidade de vezes que uma informação se encontra inserida em uma tabela.
Pode vir acompanhada da cláusula GROUP BY para agrupar as ocorrências, na lista — o que torna o relatório mais fácil de compreender.
Se esta situação for um problema para você, leia o artigo Como eliminar registros duplicados no MySQL, para entender como resolvê-la.
Neste texto, vou usar exemplos com a seguinte tabela (vista parcialmente):

SELECT * FROM clientesEstaduais LIMIT 10;
+----+------------------+---------------+--------------+---------------+
| id | NomeCliente      | RegiaoCliente | DataCadastro | CreditCliente |
+----+------------------+---------------+--------------+---------------+
|  1 | Kiara Meadows    | SP            | 2010-11-30   |          2614 |
|  2 | Iris Moreno      | SP            | 2013-03-05   |         13818 |
|  3 | Camilla Klein    | GO            | 2011-04-08   |          4954 |
|  4 | Stephanie Thomas | BA            | 2014-10-06   |          1678 |
|  5 | Emerald Alston   | PE            | 2013-12-02   |         12574 |
|  6 | Nevada Phelps    | PR            | 2014-07-26   |          5080 |
|  7 | Nita Solomon     | MG            | 2013-04-15   |          2267 |
|  8 | Suki Ayers       | MG            | 2014-10-08   |         12884 |
|  9 | Camille Ray      | RS            | 2013-07-11   |         13807 |
| 10 | Chloe Gibbs      | CE            | 2012-11-06   |          8165 |
+----+------------------+---------------+--------------+---------------+
10 rows in set (0.00 sec)

A tabela clientesEstaduais, pode ser encontrada aqui.

A função COUNT() do MySQL

A sintaxe da função é simples: COUNT(expressão).
Veja como contar a quantidade de registros da tabela clientesEstaduais:

SELECT COUNT(*) AS "Qtd. de registros" FROM clientesEstaduais;
+-------------------+
| Qtd. de registros |
+-------------------+
|               100 |
+-------------------+

Veja outras perguntas que podem ser respondidas com o uso da função COUNT() aliada à cláusula WHERE
Quantos clientes são do estado do Paraná (PR)?

SELECT COUNT(*) AS "Clientes do PR" FROM clientesEstaduais WHERE RegiaoCliente = 'PR';
+----------------+
| Clientes do PR |
+----------------+
|              6 |
+----------------+

Quantos clientes foram cadastros em Agosto (em qualquer dia/ano)?

SELECT COUNT(*) AS "Clientes de Agosto" FROM clientesEstaduais WHERE MONTH(DataCadastro)='08';
+--------------------+
| Clientes de Agosto |
+--------------------+
|                 12 |
+--------------------+

Quantos clientes têm mais de 15 mil em créditos?

SELECT COUNT(*) AS "> 15.000" FROM clientesEstaduais WHERE CreditCliente > 15000;
+----------+
| > 15.000 |
+----------+
|       19 |
+----------+

A função COUNT(), tem 2 formas.
A que temos usado, até agora, serve para contar as linhas da tabela: COUNT(*).
A outra forma usa uma expressão, como argumento e é usada para contar os valores não NULL ou non-NULL.
Em outras palavras, registros que contenham o campo NULL, não entram na conta, quando a expressão é dada como argumento.
Veja um exemplo:

SELECT COUNT(*) AS "Núm. de clientes",
    -> COUNT(DataCadastro) AS "Clientes cadastrados"
    -> FROM clientesEstaduais;

Uma vez que 2 clientes têm data de cadastro vazia (DataCadastro = NULL), a segunda coluna só irá contar 98:

+-------------------+----------------------+
| Núm. de clientes  | Clientes cadastrados |
+-------------------+----------------------+
|               100 |                   98 |
+-------------------+----------------------+

Como usar COUNT() com a cláusula GROUP BY

Além de ver os valores, você pode listar os registros, para ter um relatório mais rico.
No exemplo, abaixo, veja como obter a relação de estados presentes no cadastro de clientes, a quantidade de clientes por estado e em ordem descendente:

SELECT RegiaoCliente AS "Estados",
    -> COUNT(*) AS "Núm. de clientes"
    -> FROM clientesEstaduais
    -> GROUP BY RegiaoCliente
    -> ORDER BY COUNT(*) DESC;
+---------+-------------------+
| Estados | Núm. de clientes  |
+---------+-------------------+
| SP      |                30 |
| MG      |                18 |
| BA      |                10 |
| RJ      |                 9 |
| PR      |                 6 |
| RS      |                 6 |
| PE      |                 5 |
| CE      |                 5 |
| GO      |                 5 |
| MA      |                 3 |
| PA      |                 2 |
| PB      |                 1 |
+---------+-------------------+

No mês de Agosto, em quais datas houve maior número de cadastros?

SELECT DataCadastro,
    -> COUNT(*) FROM clientesEstaduais
    -> WHERE MONTH(DataCadastro)='08'
    -> GROUP BY DataCadastro
    -> ORDER BY COUNT(*) DESC;
+--------------+----------+
| DataCadastro | COUNT(*) |
+--------------+----------+
| 2016-08-21   |        2 |
| 2016-08-15   |        2 |
| 2016-08-11   |        2 |
| 2016-08-19   |        1 |
| 2016-08-16   |        1 |
| 2016-08-20   |        1 |
| 2016-08-13   |        1 |
| 2016-08-17   |        1 |
| 2016-08-09   |        1 |
+--------------+----------+

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), desenvolvedor web e geek, nos mais diversos assuntos. Entusiasta de software livre e hacker de LEGO, acredito em repassar meu conhecimento e ajudar as pessoas sempre que for possível.

Deixe uma resposta

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