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.