Voltar para a lista de artigos Artigos
6 minutos de leitura

GROUP BY em SQL Explained

A declaração SQL GROUP BY é fácil de usar, mas pode ser difícil de dominar. Aprenda o que você pode fazer com GROUP BY, como funciona e como utilizá-lo com funções agregadas.

GROUP BY é uma das ferramentas SQL básicas. Entretanto, pode ser difícil para iniciantes compreender como funciona GROUP BY e como é usado para computar estatísticas com diferentes funções agregadas. Neste artigo, vou usar vários exemplos para mostrar exatamente como GROUP BY organiza as linhas e como as funções agregadas podem ser usadas para calcular estatísticas em uma ou mais colunas.

Então, vamos começar.

Como funciona o SQL GROUP BY?

GROUP BY é uma ferramenta indispensável para qualquer analista de dados que trabalhe com SQL. Se você quiser organizar seus dados em grupos e calcular algum tipo de estatística agregada para estes grupos, a cláusula GROUP BY é o que você precisa.

Então, o que o GROUP BY faz? Basicamente, ele agrupa linhas com o mesmo valor em um grupo ou balde. Vamos ver como funciona.

Suponha que estamos administrando uma livraria e queremos saber quantos livros de diferentes gêneros temos em estoque. Nosso banco de dados inclui uma tabela que lista os títulos dos livros, gêneros e quantidade em estoque.

A visualização abaixo mostra como a cláusula GROUP BY cria grupos a partir dos dados da tabela. Queremos saber a quantidade total de livros para cada gênero; assim, GROUP BY agrupa os livros do mesmo gênero e resume as quantidades correspondentes. Isto cria uma tabela de resultados que lista os gêneros e sua quantidade total de livros em nosso estoque.

GROUP BY Soma

Para uma introdução mais detalhada ao tópico GROUP BY, veja este vídeo tutorial da nossa série "We Learn SQL".

GRUPO EM AÇÃO

Agora é hora de exemplos mais específicos de consultas SQL com uma cláusula GROUP BY. Vamos usar a cláusula books tabela, que armazena o ID, título, autor, gênero, idioma, preço e quantidade de cada romance que estocamos.

idtitleauthorgenrelangpriceqty
1Les Trois MousquetairesAlexandre Dumasadventurefr11.904
2A Game of ThronesGeorge R.R. Martinfantasyen8.495
3Pride and PrejudiceJane Austenromanceen9.992
4Vampire AcademyRichelle Meadfantasyen7.993
5IvanhoeWalter Scottadventureen9.993
6ArmanceStendhalromancefr5.881

Para calcular o número total de livros de cada gênero, usaremos a seguinte consulta:

SELECT genre, SUM(qty) AS total
FROM books
GROUP BY genre;

Aqui, na cláusula GROUP BY, selecionamos nossas linhas a serem agrupadas pelo gênero da coluna. Em seguida, a função SUM(qty) na declaração SELECT soma os valores qty dentro de cada grupo (ou seja, cada gênero de livro), com o resultado exibido no campo correspondente total:

genretotal
adventure7
fantasy8
romance3

Usando Funções Agregadas com GROUP BY

GROUP BY coloca filas com o mesmo valor em um balde. Normalmente queremos calcular algumas estatísticas para este grupo de linhas, como o valor médio ou a quantidade total. Para este fim, SQL fornece funções agregadas que combinam valores de uma determinada coluna em um único valor para o respectivo grupo.

Até agora, temos usado apenas SUM() como nossa função agregada para agrupar os títulos dos livros em estoque. Entretanto, esta não é a única função agregada que você pode usar com GROUP BY. SQL também oferece:

  • COUNT() para calcular o número de linhas em cada grupo.
  • AVG() para encontrar o valor médio para cada grupo.
  • MIN() para retornar o valor mínimo em cada grupo.
  • MAX() para retornar o valor máximo em cada grupo.

Vamos ver como funciona a função AVG() com GROUP BY. Desta vez, queremos calcular o preço médio dos livros em cada gênero. Vamos começar visualizando a saída que queremos obter.

GROUP BY avg

Estamos novamente agrupando nossos livros por gênero, mas desta vez queremos calcular o preço médio dos livros em cada gênero. A consulta SQL para isto parece ser a seguinte:

SELECT genre, AVG(price) AS avg_price
FROM books
GROUP BY genre;

Esta consulta cria uma tabela com duas colunas (gênero e avg_price), onde o preço médio é calculado através da média dos valores dos preços dos livros de cada gênero:

genreavg_price
adventure10.945
fantasy8.24
romance7.935

Na verdade, não estamos limitados a utilizar apenas uma função agregada com uma cláusula GROUP BY. Portanto, vamos adicionar as informações sobre o preço mínimo e máximo dos livros de cada gênero:

SELECT genre, 
MIN(price) AS min_price, 
     AVG(price) AS avg_price, 
MAX(price) AS max_price
FROM books
GROUP BY genre;

O conjunto de resultados agora inclui quatro colunas: genre, min_price, avg_price, e max_price.

genremin_priceavg_pricemax_price
adventure9.9910.94511.90
fantasy7.998.248.49
romance5.887.9359.99

Observe que ao usar GROUP BY a declaração SELECT pode incluir apenas campos que são usados na função agregada ou listados na cláusula GROUP BY . Por exemplo, em nosso caso, não podemos adicionar title ou autor a nosso conjunto de resultados. Não faz sentido fazer isso, pois cada linha em nossa tabela de resultados inclui informações sobre vários livros com títulos e autores diferentes.

Para saber sobre outros problemas que você possa encontrar ao usar GROUP BY em SQL, consulte este artigo que discute erros comuns do GROUP BY erros e como evitá-los.

GROUP BY Duas Colunas

Em SQL, você também pode agrupar seus dados usando várias colunas. Por exemplo, digamos que queremos agrupar nossos livros não apenas por gênero, mas também por linguagem. E queremos calcular o número de títulos de livros em cada categoria.

Dica: A função agregada COUNT() nos ajudará a calcular o número de títulos de livros (ou seja, linhas).

Para calcular o número de títulos de livros por gênero e idioma, usaremos a seguinte consulta:

SELECT genre, lang, count(title) AS titles
FROM books
GROUP BY genre, lang;

Obteremos uma tabela de saída com três colunas: genre, idioma (lang), e o número de titles nessa categoria:

genrelangtitles
adventureen1
adventurefr1
fantasyen2
romanceen1
romancefr1

Assim, em nosso conjunto de dados de exemplo, nós temos:

  • Um título de livro em inglês, no gênero aventura(Ivanhoe).
  • Um título de livro em língua francesa no gênero aventura(Les Trois Mousquetaires).
  • Dois títulos de livros em língua inglesa no gênero fantasia(A Game of Thrones e Vampire Academy).
  • Um título de livro em inglês no gênero romance(Pride and Prejudice).
  • Um título de livro em língua francesa no gênero romance(Armance).

Como você vê, não há livros de fantasia em língua francesa em nosso conjunto de dados.

Para mais exemplos de aplicações GROUP BY, veja este artigo mostrando como o GROUP BY pode ser alavancado em cenários comerciais realistas.

Pronto para usar GROUP BY em SQL?

Agora você tem uma melhor compreensão de como GROUP BY pode ajudá-lo na organização e análise de seus dados. Entretanto, se você quiser lidar com GROUP BY como um profissional, você precisa de muita prática.

LearnSQL.com.br oferece um SQL para Iniciantes curso que inclui 129 exercícios interativos cobrindo agregação, agrupamento, junção, subconsultas, e muito mais. Este curso é uma oportunidade perfeita para aprender como agrupar linhas e calcular estatísticas com funções agregadas.

Feliz aprendizagem!