Cláusula SQL GROUP BY e HAVING com exemplos
O que é a cláusula SQL Group by?
A cláusula GROUP BY é um comando SQL usado para agrupar linhas que possuem os mesmos valores. A cláusula GROUP BY é usada na instrução SELECT. Opcionalmente, é usado em conjunto com funções agregadas para produzir relatórios resumidos do banco de dados.
É isso que faz, resumindo dados do banco de dados.
As consultas que contêm a cláusula GROUP BY são chamadas de consultas agrupadas e retornam apenas uma única linha para cada item agrupado.
GRUPO SQL POR Sintaxe
Agora que sabemos o que é a cláusula SQL GROUP BY, vamos dar uma olhada na sintaxe de um grupo básico por consulta.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
AQUI
- “Instruções SELECT…” é a consulta de comando SQL SELECT padrão.
- "GROUP BY nome_coluna1” é a cláusula que realiza o agrupamento com base em nome_coluna1.
- “[,column_name2,…]” é opcional; representa outros nomes de colunas quando o agrupamento é feito em mais de uma coluna.
- “[TER condição]” é opcional; é usado para restringir as linhas afetadas pela cláusula GROUP BY. É semelhante ao Cláusula WHERE.
Agrupando usando um Coluna única
Para ajudar a entender o efeito da cláusula SQL Group By, vamos executar uma consulta simples que retorna todas as entradas de gênero da tabela de membros.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Suponha que queiramos obter os valores exclusivos para os gêneros. Podemos usar a seguinte consulta -
SELECT `gender` FROM `members` GROUP BY `gender`;
Executando o script acima em MySQL bancada contra o Myflixdb nos dá os seguintes resultados.
gender |
---|
Female |
Male |
Observe que apenas dois resultados foram retornados. Isso ocorre porque só temos dois tipos de gênero Masculino e Feminino. A cláusula GROUP BY em SQL agrupou todos os membros “Masculinos” e retornou apenas uma única linha para eles. Fez o mesmo com os membros “femininos”.
Agrupando usando várias colunas
Suponha que queiramos obter uma lista de Category_id de filmes e os anos correspondentes em que foram lançados.
Vamos observar o resultado desta consulta simples
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
O resultado acima tem muitas duplicatas.
Vamos executar a mesma consulta usando group by em SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Executando o script acima em MySQL workbench contra o myflixdb nos dá os seguintes resultados mostrados abaixo.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
A cláusula GROUP BY opera tanto no id da categoria quanto no ano liberado para identificar único linhas em nosso exemplo acima.
Se o ID da categoria for o mesmo, mas o ano de lançamento for diferente, então uma linha será tratada como única. Se o ID da categoria e o ano de lançamento forem iguais para mais de uma linha, será considerada uma duplicata e apenas uma linha é mostrado.
Agrupamento e funções agregadas
Suponha que queiramos o número total de homens e mulheres em nosso banco de dados. Podemos usar o seguinte script mostrado abaixo para fazer isso.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Executando o script acima em MySQL workbench contra o myflixdb nos dá os seguintes resultados.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Os resultados mostrados abaixo são agrupados por cada valor exclusivo de gênero postado e o número de linhas agrupadas é contado usando a função agregada COUNT.
Restringindo resultados de consulta usando o TENDO cláusula
Nem sempre queremos realizar agrupamentos em todos os dados de uma determinada tabela. Haverá momentos em que desejaremos restringir nossos resultados a determinados critérios. Nesses casos, podemos usar a cláusula HAVING
Suponha que queiramos saber todos os anos de lançamento da categoria de filme id 8. Usaríamos o seguinte script para alcançar nossos resultados.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Executando o script acima em MySQL workbench contra o Myflixdb nos dá os seguintes resultados mostrados abaixo.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Observe que apenas os filmes com identificação de categoria 8 foram afetados por nossa cláusula GROUP BY.
Resumo
- A cláusula GROUP BY SQL é usada para agrupar linhas com os mesmos valores.
- A cláusula GROUP BY é usada junto com a cláusula Instrução SQL SELECT.
- A instrução SELECT usada na cláusula GROUP BY só pode ser usada para conter nomes de colunas, funções agregadas, constantes e expressões.
- A cláusula SQL Tendo é usada para restringir os resultados retornados pela cláusula GROUP BY.
- A cláusula MYSQL GROUP BY é usada para coletar dados de vários registros e registros retornados definidos por uma ou mais colunas.