CodeGym /Cursos /SQL SELF /Agrupando dados (GROUP BY): sintaxe e estrutura

Agrupando dados (GROUP BY): sintaxe e estrutura

SQL SELF
Nível 8 , Lição 0
Disponível

Imagina que tu tá lidando com milhares de linhas de dados — como achar sentido nisso tudo? É aí que entra o operador GROUP BY — tipo um maestro no rolê do SQL. Ele pega dados soltos e transforma numa melodia certinha: conta, agrupa, faz resumo. Quer saber quantos pedidos cada cliente fez, quantos estudantes tem em cada curso ou como os salários tão distribuídos nos departamentos? Tudo isso é trampo do GROUP BY. Hoje a gente vai ver como ficar brother dele e tirar o máximo das tuas tabelas.

Agrupamento é o processo de juntar linhas que têm os mesmos valores em uma ou mais colunas, formando grupos lógicos. Isso permite aplicar funções agregadas separadamente pra cada grupo.

Imagina que tu tem uma tabela de funcionários e quer saber o salário médio de cada departamento. Um departamento — um grupo. O SQL usa GROUP BY pra dividir a tabela de funcionários por departamento e depois aplica AVG() em cada grupo.

Sintaxe do GROUP BY

A regra principal pra usar agrupamento no SQL: se tu usa GROUP BY, toda coluna que não faz parte de uma função agregada tem que estar no GROUP BY.

Sintaxe:

SELECT coluna1, 
       funcao_agregada(coluna2)
FROM tabela
GROUP BY coluna1;

Passos pra usar:

  1. Coloca a coluna que tu quer agrupar no GROUP BY.
  2. Usa funções agregadas pra calcular valores nos grupos.
  3. Todas as colunas no SELECT que não tão em funções agregadas precisam estar no GROUP BY. SQL é chato com isso, se tu esquecer ele vai te dar erro.

Exemplo: Agrupando estudantes por faculdade

Vamos supor que a gente tem uma tabela students que guarda dados dos estudantes:

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Agora a gente quer saber a média do GPA de cada faculdade. Pra isso, bora fazer uma query com GROUP BY:

SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;

Resultado:

faculty avg_gpa
ComputerSci 3.9
Math 3.7
Physics 3.7

O SQL primeiro separou os dados em grupos pelo valor da coluna faculty e depois aplicou a função AVG() em cada grupo.

Detalhes do GROUP BY

  1. Regras pras colunas no SELECT

O SQL exige que todas as colunas que tu coloca no SELECT mas não usa em funções agregadas (tipo SUM(), COUNT()) estejam no GROUP BY. Isso porque sem agrupar, o SQL não sabe que valor mostrar.

Tenta rodar essa query e tu vai ver um erro:

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;

Erro: coluna name não tá no GROUP BY. Pra arrumar, coloca name no GROUP BY:

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;

Mas aí tu vai agrupar os dados por estudante — não era bem isso que a gente queria no começo.

  1. Agrupando por várias colunas

Tu pode agrupar não só por uma coluna, mas por várias. Por exemplo, além de faculdade, quer agrupar estudantes pelo nome. Só botar a segunda coluna no GROUP BY:

SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;

Tabela original:

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Resultado:

faculty name avg_gpa
ComputerSci Alex Lin 3.8
ComputerSci Anna Song 4.0
Math Maria Chi 3.5
Math Otto Art 3.9
Physics Liam Park 3.7
  1. Agrupando usando várias funções agregadas

Não precisa se limitar a uma função só! Por exemplo, bora contar quantos estudantes tem em cada faculdade e calcular a média do GPA:

SELECT faculty,
       COUNT(*) AS student_count, 
       AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;

Tabela original:

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Resultado:

faculty student_count avg_gpa
ComputerSci 2 3.9
Math 2 3.7
Physics 1 3.7

Detalhes do agrupamento no SQL: o que pode e o que não pode colocar

Fazer query com agrupamento é fácil, mas provavelmente metade das tuas queries não vai funcionar de primeira. O agrupamento rola de um jeito meio diferente do que a gente imagina.

Se tua query SQL tem GROUP BY, pensa em todas as colunas do resultado como expressões calculadas. As colunas no SELECT só podem ser de dois tipos:

  • calculadas por funções agregadas baseadas nas colunas do grupo.
  • vindas do GROUP BY — tem que estar no agrupamento.

Se tu faz uma query GROUP BY na tabela de estudantes, no resultado não pode ter estudantes específicos! Tu pode ter média de altura, média de peso, média de nota. Esse código aqui não vai funcionar:

SELECT faculty, name
FROM students
GROUP BY faculty;

Bora tentar entender o porquê.

O operador GROUP BY faculty vai dividir os estudantes da tabela students em grupos com o mesmo faculty em cada grupo. Como todos os estudantes do grupo têm o mesmo faculty, dá pra dizer que o atributo faculty pertence ao grupo. Mas o name de cada estudante é diferente. Então o grupo não tem um atributo name único.

O operador GROUP BY faculty, gender vai dividir os estudantes da tabela students em grupos com o mesmo faculty e gender em cada grupo. Então todos os estudantes de cada grupo vão ter o mesmo faculty e gender. Assim, o grupo tem os atributos faculty e gender. Mas ainda não tem um name único pro grupo.

Assim pode fazer:

SELECT faculty, gender
FROM students
GROUP BY faculty, gender;

Pode até assim:

SELECT
    faculty, 
    gender, 
    AVG(age) as group_avg_age,  -- Valor calculado com base nos age do grupo de estudantes
    MAX(high) as group_high     -- Valor calculado com base nos high do grupo de estudantes
FROM students
GROUP BY faculty, gender;

Mas não dá pra usar age e high direto no SELECT nesse caso.

Erros comuns ao usar GROUP BY

Quando tu começar a escrever queries com GROUP BY, olha só uns perrengues que podem aparecer:

  1. Nem todas as colunas estão no SELECT. Lembra: toda coluna que não é agregada tem que estar no GROUP BY. Senão o SQL não sabe como mostrar.

  2. Agrupando por NULL. Valores NULL viram um grupo separado. Se tua coluna tem NULL, o SQL vai criar um grupo pra NULL.

  3. Grupos demais. Se tu colocar coluna demais no GROUP BY, pode acabar com resultados detalhados demais, difíceis de analisar.

Agora tu já sabe como agrupar dados de boa usando GROUP BY. É uma das ferramentas mais poderosas do SQL, que deixa fácil trabalhar com dados agregados e criar relatórios organizados. Depois a gente vai mergulhar mais fundo na mágica do agrupamento e ver como filtrar ainda mais usando HAVING.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION