</>Codding

Módulo 1 • Consultas

GROUP BY e HAVING

Ferramentas e leitura
Leitura100%
Aula guiada50–75 min5 etapas práticas

Nesta aula, você vai compreender GROUP BY e HAVING com explicação progressiva, exemplo resolvido, checagens e prática. Nada de apenas copiar: cada etapa prepara a próxima.

Antes de começar: Leia a aula anterior do módulo se algum termo parecer novo. Você pode testar o exemplo antes de continuar.

Ao terminar, você vai conseguir

  • Explicar GROUP BY e HAVING com suas próprias palavras
  • Reconhecer as partes importantes em um exemplo real
  • Identificar e corrigir os erros mais frequentes
  • Aplicar o conteúdo em uma atividade prática
1

Dados

Entenda o formato e a qualidade da entrada.

2

Operação

Aplique GROUP BY e HAVING de maneira controlada.

3

Interpretação

Leia o resultado e confirme se ele responde ao problema.

0/6 atividades
1

Entenda o problema

O que é GROUP BY e HAVING

SQL é declarativo: você descreve o resultado desejado e o banco decide como buscar. A ordem lógica de execução é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Cheque seu entendimento

Qual a diferença entre WHERE e HAVING?

1 de 5

O que você aprendeu

  • SQL é declarativo: você descreve o resultado desejado e o banco decide como buscar. A ordem lógica de execução é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
  • Carla não tem pedidos, mas aparece com 0 graças ao LEFT JOIN + COALESCE. HAVING filtra o resultado já agrupado.
  • Evite: Usar função de agregação no WHERE em vez do HAVING.
  • Evite: Condição da tabela direita no WHERE anulando o LEFT JOIN.

Videoaulas sobre este tema

Se você aprende melhor assistindo, abrimos uma seleção de aulas em vídeo em português sobre exatamente este assunto.

Quiz rápido

0/2 • 0 certas

1. Qual a diferença entre WHERE e HAVING?

2. LEFT JOIN garante que:

Laboratório

1/4

1. Faça funcionar

Escreva uma consulta que devolva 15 como resultado da soma de 1 a 5.

Abrir no playground
  • Checkpoints da prática (1/4)
  • Escreva sua versão a partir do modeloO texto do editor ainda é igual ao modelo inicial. Altere pelo menos uma linha para que a prática conte como sua.
  • Nenhuma lacuna deixada em branco
  • Execute seu códigoClique em “Verificar resposta” para rodar seu código e comparar a saída com o esperado.
  • Resultado ainda não confereEsperado: a saída precisa conter “15”. Rode o código para comparar. Isso vale porque a aula usa exatamente esse resultado para provar que a lógica está certa.

Escreva sua solução e clique em Verificar.

Tire sua dúvida

Cada resposta é conferida contra o material desta lição antes de aparecer. Sem IA por trás e sem inventar nada.

GROUP BY e HAVING

SQL & Banco de Dados • Módulo 1: Consultas • Codding — material para estudo offline

Aluno: ______________________________ Data: ____ / ____ / ______

Nesta aula, você vai compreender GROUP BY e HAVING com explicação progressiva, exemplo resolvido, checagens e prática. Nada de apenas copiar: cada etapa prepara a próxima.

Objetivos da aula

  • Explicar GROUP BY e HAVING com suas próprias palavras
  • Reconhecer as partes importantes em um exemplo real
  • Identificar e corrigir os erros mais frequentes
  • Aplicar o conteúdo em uma atividade prática

Pré-requisito: Leia a aula anterior do módulo se algum termo parecer novo. Você pode testar o exemplo antes de continuar. • Duração: 50–75 min

Explicação passo a passo

1. O que é GROUP BY e HAVING

SQL é declarativo: você descreve o resultado desejado e o banco decide como buscar. A ordem lógica de execução é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Checkpoint: Qual a diferença entre WHERE e HAVING? — Resposta: WHERE filtra linhas antes de agrupar; HAVING filtra grupos depois

2. Como pensar antes de fazer

WHERE filtra linhas antes do agrupamento; HAVING filtra grupos depois. Tentar usar uma função de agregação no WHERE é erro clássico.

Dica: Não decore a forma. Tente explicar com suas palavras qual problema “GROUP BY e HAVING” resolve.

3. Exemplo completo, do início ao resultado

INNER JOIN devolve só as correspondências; LEFT JOIN mantém tudo da tabela da esquerda e preenche com NULL. Se um LEFT JOIN 'virou' INNER, quase sempre a culpa é de uma condição sobre a tabela direita colocada no WHERE em vez do ON.

CREATE TABLE cliente (id INTEGER PRIMARY KEY, nome TEXT);
CREATE TABLE pedido (id INTEGER PRIMARY KEY, cliente_id INTEGER, total REAL);

INSERT INTO cliente VALUES (1,'Ana'), (2,'Bruno'), (3,'Carla');
INSERT INTO pedido VALUES (1,1,100.0), (2,1,50.0), (3,2,900.0);

SELECT c.nome, COUNT(p.id) AS pedidos, COALESCE(SUM(p.total), 0) AS gasto
FROM cliente c
LEFT JOIN pedido p ON p.cliente_id = c.id
GROUP BY c.id, c.nome
HAVING COALESCE(SUM(p.total), 0) >= 0
ORDER BY gasto DESC;
TrechoO que faz
CREATE TABLE cliente (id INTEGER PRIMARY KEY, nome TEXT);Contribui para a transformação principal mostrada neste exemplo.
CREATE TABLE pedido (id INTEGER PRIMARY KEY, cliente_id INTEGER, total REAL);Contribui para a transformação principal mostrada neste exemplo.
INSERT INTO cliente VALUES (1,'Ana'), (2,'Bruno'), (3,'Carla');Contribui para a transformação principal mostrada neste exemplo.
INSERT INTO pedido VALUES (1,1,100.0), (2,1,50.0), (3,2,900.0);Contribui para a transformação principal mostrada neste exemplo.
SELECT c.nome, COUNT(p.id) AS pedidos, COALESCE(SUM(p.total), 0) AS gastoDefine uma etapa da consulta e restringe como os dados serão obtidos.
FROM cliente cDefine uma etapa da consulta e restringe como os dados serão obtidos.
LEFT JOIN pedido p ON p.cliente_id = c.idContribui para a transformação principal mostrada neste exemplo.
GROUP BY c.id, c.nomeDefine uma etapa da consulta e restringe como os dados serão obtidos.

Dica: Carla não tem pedidos, mas aparece com 0 graças ao LEFT JOIN + COALESCE. HAVING filtra o resultado já agrupado.

Checkpoint: LEFT JOIN garante que: — Resposta: Todas as linhas da tabela da esquerda aparecem, com NULL onde não houver par

4. Do detalhe para o todo

Índices tornam a busca rápida em colunas usadas em WHERE e JOIN, ao custo de escrita e espaço. E toda comparação com NULL usa IS NULL — NULL = NULL é desconhecido, não verdadeiro.

5. Erros comuns e como corrigi-los

1. Usar função de agregação no WHERE em vez do HAVING. 2. Condição da tabela direita no WHERE anulando o LEFT JOIN. 3. Comparar com = NULL em vez de IS NULL.

Dica: Quando algo der errado, compare uma diferença por vez com o exemplo. Evite mudar várias partes ao mesmo tempo.

Prática guiada

1. 1. Faça funcionar

Escreva uma consulta que devolva 15 como resultado da soma de 1 a 5.

SELECT 1 + 2 + 3 + 4;

Dica: Volte ao exemplo resolvido e compare a estrutura. Usar função de agregação no WHERE em vez do HAVING.

Saída esperada: 15

2. 2. Preveja antes de testar

Sem executar, explique qual resultado o exemplo de GROUP BY e HAVING deve produzir e qual parte é responsável por ele.

Minha previsão:

A parte responsável pelo resultado:

Como vou conferir:

Dica: Use o modelo mental da aula: entrada, transformação e evidência observável.

3. 3. Encontre e corrija o erro

Use o exemplo de GROUP BY e HAVING, identifique um risco citado na aula e registre ou implemente a correção.

SELECT 1 + 2 + 3 + 4;

Dica: Usar função de agregação no WHERE em vez do HAVING.

Saída esperada: 15

4. 4. Aplique em um caso novo

Crie uma variação própria usando GROUP BY e HAVING. Mude os dados ou o cenário e demonstre que o resultado continua correto.

SELECT 1 + 2 + 3 + 4;

Dica: Mantenha a estrutura que já funcionou e altere uma decisão por vez.

Saída esperada: 15

Revisão

  • SQL é declarativo: você descreve o resultado desejado e o banco decide como buscar. A ordem lógica de execução é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
  • Carla não tem pedidos, mas aparece com 0 graças ao LEFT JOIN + COALESCE. HAVING filtra o resultado já agrupado.
  • Evite: Usar função de agregação no WHERE em vez do HAVING.
  • Evite: Condição da tabela direita no WHERE anulando o LEFT JOIN.

Exemplo comentado

CREATE TABLE cliente (id INTEGER PRIMARY KEY, nome TEXT);
CREATE TABLE pedido (id INTEGER PRIMARY KEY, cliente_id INTEGER, total REAL);

INSERT INTO cliente VALUES (1,'Ana'), (2,'Bruno'), (3,'Carla');
INSERT INTO pedido VALUES (1,1,100.0), (2,1,50.0), (3,2,900.0);

SELECT c.nome, COUNT(p.id) AS pedidos, COALESCE(SUM(p.total), 0) AS gasto
FROM cliente c
LEFT JOIN pedido p ON p.cliente_id = c.id
GROUP BY c.id, c.nome
HAVING COALESCE(SUM(p.total), 0) >= 0
ORDER BY gasto DESC;

Carla não tem pedidos, mas aparece com 0 graças ao LEFT JOIN + COALESCE. HAVING filtra o resultado já agrupado.

Erros comuns

  • Usar função de agregação no WHERE em vez do HAVING.
  • Condição da tabela direita no WHERE anulando o LEFT JOIN.
  • Comparar com = NULL em vez de IS NULL.

Quiz e gabarito completo

  1. 1. Qual a diferença entre WHERE e HAVING?

    • a) Nenhuma
    • b) WHERE filtra linhas antes de agrupar; HAVING filtra grupos depois
    • c) HAVING é mais rápido
    • d) WHERE só funciona com JOIN

    Gabarito: b) WHERE filtra linhas antes de agrupar; HAVING filtra grupos depois — HAVING é o filtro das agregações.

  2. 2. LEFT JOIN garante que:

    • a) Só linhas com correspondência aparecem
    • b) Todas as linhas da tabela da esquerda aparecem, com NULL onde não houver par
    • c) As duas tabelas devem ter o mesmo tamanho
    • d) O resultado vem ordenado

    Gabarito: b) Todas as linhas da tabela da esquerda aparecem, com NULL onde não houver par — É o join usado para contar zeros também.

Codding • SQL & Banco de Dados • GROUP BY e HAVING • Prova final e certificado em codding.lovable.app/cursos/sql/prova