Olá!
O comando Group By tem o objetivo de realizar o agrupamento dos registros de uma consulta, sendo que primeiramente é realizado a seleção dos registros da tabela e depois é aplicado o agrupamento no resultado da consulta.
Sintaxe: GROUP BY campo(s)_presentes_no_select
Note que os campos mencionados no GROUP BY são todos os campos presentes no SELECT.
Tabela para os exemplos:
PESSOA | |||
CD_PESSOA | NOME | SOBRENOME | IDADE |
1 | Felipe | Barbosa | 23 |
2 | Ana | Vieira | 20 |
3 | João | Barbosa | 19 |
4 | Aline | Barbosa | 21 |
5 | Maira | Ferreira | 25 |
6 | Ana | Havana | 19 |
7 | Aline | Ferreira | 22 |
Exemplo de consulta com o Group By:
SELECT NOME
FROM PESSOA
WHERE IDADE > 18
WHERE IDADE > 18
GROUP BY NOME;
Resultado:
Resposta da execução do SQL | |
1º aplicação do Where | 2º aplicação do Group By |
Felipe | Felipe |
Ana | Ana |
João | João |
Aline | Aline |
Maira | Maira |
Ana | |
Aline |
Como o agrupamento é realizado na resposta da consulta, repare que as linhas que possuem o mesmo valor não são apresentadas em registros diferentes, e isso não significa que elas foram descartadas. O que acontece é que foram agrupadas em um único registro.
Outro exemplo de consulta com o Group By:
SELECT NOME
, SOBRENOME
FROM PESSOA
WHERE IDADE > 18
WHERE IDADE > 18
GROUP BY NOME
, SOBRENOME;
Resultado:
Resposta da execução do SQL | |
NOME | SOBRENOME |
Felipe | Barbosa |
João | Barbosa |
Aline | Barbosa |
Ana | Vieira |
Maira | Ferreira |
Aline | Ferreira |
Ana | Havana |
Sim, o resultado visual seria o mesmo. Entretanto, com Distinct os registros que possuem o mesmo valor são desprezados totalmente, e com o Order By os registros seriam agrupados somente em efeito visual.
Assim, é necessário avaliar o objetivo da consulta, pois na maioria das vezes o Group By é utilizado quando ocorre o questionamento de quantidade sobre um determinado grupo de informações, ou a necessidade de utilizar uma função agregada.
Exemplo: Quantos nomes cada sobrenome possui, ou seja, quantos nomes há cadastrados para o sobrenome Barbosa, Vieira, Ferreira e Havana? Para responder essa questão, é necessário elaborar um SQL agrupado pelo sobrenome e uma função para realizar a contagem (Count( ) no próximo post).
Exemplo: Quantos nomes cada sobrenome possui, ou seja, quantos nomes há cadastrados para o sobrenome Barbosa, Vieira, Ferreira e Havana? Para responder essa questão, é necessário elaborar um SQL agrupado pelo sobrenome e uma função para realizar a contagem (Count( ) no próximo post).
Então, podemos dizer que o SQL que contém o comando Group By tem dois passos de execução, o primeiro é agrupar os registros em conjuntos, e o segundo é agrupar os registros desses conjuntos que possuem valores iguais em um único registro, veja o fluxo abaixo para o questionamento anterior sobre a quantidade de nomes para cada sobrenome:
Fluxo da execução do SQL | |||||
1º passo de execução | 2º passo de execução | Resultado Final | |||
SOBRENOME | Contador | SOBRENOME | Contador | SOBRENOME | Contador |
Barbosa | 1 | Barbosa | 1 + 1 + 1 | Barbosa | 3 |
Barbosa | 1 | Barbosa | 1 | Vieira | 1 |
Barbosa | 1 | Barbosa | 1 | Ferreira | 2 |
Vieira | 1 | Vieira | 1 | Havana | 1 |
Ferreira | 1 | Ferreira | 1 + 1 | ||
Ferreira | 1 | Ferreira | 1 | ||
Havana | 1 | Havana | 1 |
Note que no primeiro passo de execução os registros são agrupados em conjuntos, e no segundo passo de execução os registros que possuem o mesmo valor são agrupados em uma linha. O resultado final indica que temos 3 nomes para o sobrenome Barbosa, 2 nomes para o sobrenome Ferreira, 1 nome para o sobrenome Vieira e Havana.
Felipe Barbosa Ferreira
Até o próximo post!