MySQL - Usando HAVING para limitar queries com agrupamentos GROUP

Agrupamentos são incrivelmente uteis quando precisamos fazer somas ou contar itens de várias linhas de um DB. Apesar de muitas pessoas utilizarem a linguagem em que estão desenvolvendo sua aplicação para fazer este tipo de operação as queries dos bancos de dados são a forma mais eficiente de se fazer isto.

Vamos supor que você tenha uma tabela como a que segue abaixo:









NomeCPFVeiculo
Antonio240.400.462-00Corsa
Antonio240.400.462-00Vectra
Pedro798.455.105-74Gol

E necessitamos do total de veículos de cada CPF. Então teríamos um SELECT deste tipo:

SELECT Nome,CPF,COUNT(CPF) AS Quantidade FROM veiculos GROUP BY CPF.

E nosso resultado seria algo como







NomeCPFQuantidade
Antonio240.400.462-002
Pedro798.455.105-741

Mas e se nos interessasse  resultados que trouxessem apenas cpf's com mais de dois carros?
É para isto que usamos HAVING. HAVIING é como um WHERE porém utilizado para limitar buscas em agrupamentos.

No exemplo acima fariamos assim:

SELECT Nome,CPF,COUNT(CPF) AS Quantidade FROM veiculos GROUP BY CPF HAVING COUNT(CPF) > 1

Isto nos traria apenas os CPF's com mais um carro







NomeCPFVeiculo
Antonio240.400.462-002

Uma boa utilização também desta técnica é na identificação de registros duplicados. Pode ocorrer, por exemplo, que em uma certa tabela o campo CPF não foi (ou não pode ser) setado como chave ou indice de valor único. Com a técnica do HAVING você pode retornar apenas os registros com dois ou mais CPF's e efetuar algum tipo de validação, ou estudar o porquê do campo estar duplicado.

Os agrupamentos mais comuns incluem COUNT(), SUM(), AVG(), MIN() e MAX().

Podemos não só utilizar o HAVING com agrupamentos mas também como um WHERE

SELECT Nome,CPF AS Quantidade FROM veiculos HAVING Nome = 'Antonio'

teria o mesmo efeito que

SELECT Nome,CPF AS Quantidade FROM veiculos WHERE Nome = 'Antonio'

Porém isto não é recomendável, já que WHERE é mais eficiente que HAVING neste tipo de query.

Por hoje é isto!

Comentários

Postar um comentário

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()