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!
Nenhum comentário:
Postar um comentário