UC2 · Implementar Banco de Dados

JOIN e Agregações

Aula 14 — Cruzando tabelas e resumindo dados

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

O mapa de hoje

  • Bloco 1 — INNER JOIN: cruzar duas tabelas
  • Bloco 2 — LEFT JOIN: e quem não tem par?
  • Bloco 3 — agregações: COUNT, SUM, AVG e GROUP BY
  • Bloco 4 — mão na massa: perguntas que só o JOIN responde
Esta é, com folga, a aula mais útil da UC para o mercado de trabalho. Quem domina JOIN e GROUP BY responde 80% do que se pede a um programador em relatório.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Retomando a Aula 13

  • Qual a diferença entre o que o SELECT escolhe e o que o WHERE escolhe?
  • Por que = NULL não funciona?
  • Qual é o primeiro passo antes de escrever qualquer consulta?
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Bloco 1

INNER JOIN — cruzando duas tabelas

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone O problema de ontem

SELECT * FROM jogo devolve:

id_jogo titulo id_plataforma
10 God of War 1
11 Zelda TotK 2

O dono não quer ver 1. Ele quer ver "PlayStation 5".

O nome da plataforma está na outra tabela. Precisamos das duas ao mesmo tempo.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone INNER JOIN — a solução

SELECT jogo.titulo,
       plataforma.nome
FROM   jogo
INNER JOIN plataforma ON jogo.id_plataforma = plataforma.id_plataforma;
EN PT
JOIN juntar — cruzar duas tabelas
INNER JOIN junção interna — só as linhas que têm par nas duas
ON sobre / usando — a condição que liga as duas tabelas
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone O que acontece por dentro

As tabelas jogo e plataforma se cruzam pela chave estrangeira e produzem o resultado do INNER JOIN

Para cada linha de jogo, o banco procura a linha de plataforma com o mesmo id e cola as duas.

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Apelidos de tabela — para não escrever tanto

SELECT j.titulo, p.nome
FROM   jogo j
INNER JOIN plataforma p ON j.id_plataforma = p.id_plataforma;

jogo j quer dizer: "a partir de agora, chame jogo de j".

Use apelidos curtos e óbvios: j para jogo, c para cliente. Apelido como a, b, t1 deixa a consulta ilegível daqui a um mês.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone JOIN com três tabelas

SELECT c.nome   AS "Cliente",
       j.titulo AS "Jogo",
       e.data_retirada
FROM   emprestimo e
INNER JOIN cliente c ON e.id_cliente = c.id_cliente
INNER JOIN jogo    j ON e.id_jogo    = j.id_jogo;
Comece pela tabela do meio (a que tem as chaves estrangeiras) e vá juntando as outras. Um INNER JOIN ... ON para cada ligação.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Checagem do Bloco 1

Complete o ON:

SELECT c.nome, e.data_retirada
FROM   emprestimo e
INNER JOIN cliente c ON ______________ ;
  • E se eu quisesse também o título do jogo?
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Bloco 2

LEFT JOIN — e quem não tem par?

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone O problema que o INNER esconde

"Liste todos os clientes e os empréstimos de cada um."

Com INNER JOIN, a Carla — que se cadastrou mas nunca alugou — não aparece.

O INNER JOIN só mostra quem tem par nas duas tabelas. Quem não tem par simplesmente some do resultado — sem aviso.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone LEFT JOIN — todo mundo da esquerda

O INNER JOIN deixa Carla de fora por ela nao ter emprestimo; o LEFT JOIN traz Carla com NULL no emprestimo

SELECT c.nome, e.data_retirada
FROM   cliente c
LEFT JOIN emprestimo e ON c.id_cliente = e.id_cliente;

A Carla aparece, com NULL na coluna do empréstimo.

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone Quando usar cada um

Pergunta JOIN
"Quais jogos existem, com o nome da plataforma?" INNER — todo jogo tem plataforma
"Todos os clientes e seus empréstimos" LEFT — inclusive quem nunca alugou
"Quais clientes nunca alugaram?" LEFT + WHERE e.id_emprestimo IS NULL
A terceira linha é um truque muito usado no mercado: LEFT JOIN e depois filtrar pelo NULL encontra exatamente quem não tem par.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone Erro comum — o WHERE que mata o LEFT JOIN

-- Errado: vira INNER JOIN disfarçado
SELECT c.nome, e.data_retirada
FROM   cliente c
LEFT JOIN emprestimo e ON c.id_cliente = e.id_cliente
WHERE  e.data_retirada > '2026-10-01';
A Carla tem NULL em data_retirada, e NULL > data não é verdadeiro — então o WHERE joga ela fora de novo. Condição sobre a tabela da direita vai no ON, não no WHERE.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Checagem do Bloco 2

Qual JOIN você usaria?

  • "Quais jogos foram alugados e por quem?"
  • "Todos os jogos do catálogo, com a quantidade de vezes que foram alugados"
  • "Quais jogos nunca saíram da prateleira?"
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Bloco 3

Agregações — resumindo muitas linhas em uma

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone As funções de agregação

SELECT COUNT(*)             AS "Quantos jogos",
       AVG(ano_lancamento)  AS "Ano médio",
       MIN(ano_lancamento)  AS "Mais antigo",
       MAX(ano_lancamento)  AS "Mais novo"
FROM   jogo;
EN PT
COUNT contar
SUM somar
AVG average — média
MIN / MAX mínimo / máximo
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone GROUP BY — resumir por grupo

Seis linhas de jogo viram tres linhas de resultado quando o GROUP BY junta por plataforma

SELECT p.nome, COUNT(*) AS total_jogos
FROM   jogo j
INNER JOIN plataforma p ON j.id_plataforma = p.id_plataforma
GROUP BY p.nome;
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

A regra do GROUP BY

Toda coluna que aparece no SELECT e não está dentro de uma função de agregação precisa estar no GROUP BY.
-- Erro: titulo não está no GROUP BY nem é agregado
SELECT p.nome, j.titulo, COUNT(*) FROM jogo j
INNER JOIN plataforma p ON j.id_plataforma = p.id_plataforma
GROUP BY p.nome;
ERROR: column "j.titulo" must appear in the GROUP BY clause
or be used in an aggregate function
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone HAVING — filtrar depois de agrupar

SELECT p.nome, COUNT(*) AS total
FROM   jogo j
INNER JOIN plataforma p ON j.id_plataforma = p.id_plataforma
GROUP BY p.nome
HAVING COUNT(*) > 2;
WHERE filtra linhas, antes de agrupar.
HAVING filtra grupos, depois de agrupar.
Não dá para usar COUNT(*) no WHERE — naquele momento a contagem ainda não existe.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

icone Juntando tudo — a consulta completa

SELECT c.nome                AS "Cliente",
       COUNT(e.id_emprestimo) AS "Empréstimos"
FROM   cliente c
LEFT JOIN emprestimo e ON c.id_cliente = e.id_cliente
GROUP BY c.nome
ORDER BY COUNT(e.id_emprestimo) DESC;

"Quantos empréstimos cada cliente fez, do que mais alugou para o que menos alugou — incluindo quem nunca alugou."

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Checagem do Bloco 3

Escreva a consulta para cada pergunta da dona:

  • "Quantos jogos eu tenho de cada plataforma?"
  • "E só as plataformas com mais de dois?"
  • "Quantos empréstimos cada cliente fez, incluindo quem não fez nenhum?"
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Perguntas que só o JOIN responde

  1. Escrevam 5 perguntas do negócio que exigem mais de uma tabela
  2. Pelo menos uma com INNER JOIN de duas tabelas
  3. Pelo menos uma com INNER JOIN de três tabelas
  4. Pelo menos uma com LEFT JOIN, que inclua quem não tem par
  5. Pelo menos uma com GROUP BY e COUNT
  6. Rodem duas delas também no notebook, com fetchall()
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Lembrete de entrega

Padrão Hoje
grupoNN-aulaNN-artefato.<ext> grupo03-aula14-consultas-join.sql
Cada consulta com o comentário da pergunta em português em cima, como na Aula 13.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Enquanto vocês consultam

O que eu vou conferir:

  • O ON está na forma FK = PK?
  • A consulta de três tabelas começou pela tabela do meio?
  • No LEFT JOIN, o registro sem par apareceu mesmo no resultado?
  • Toda coluna não agregada está no GROUP BY?
  • Alguém usou COUNT(*) onde deveria contar a coluna?
Terminou? Tente: "qual foi o mês com mais empréstimos?" Vai precisar de GROUP BY, ORDER BY e LIMIT 1 ao mesmo tempo.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Devolutiva — passo de mesa em mesa

Eu passo em cada grupo. Deixem uma consulta com JOIN na tela:

  • A pergunta em português
  • O SQL, com o ON explicado — de qual chave para qual chave
  • O resultado rodando
Na hora do ON, aponte no DER de vocês: "essa linha do desenho é esse ON do SQL". É o fechamento de nove aulas de modelagem.
Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Antes da próxima aula

Testar em casa: escreva a consulta "qual o jogo mais alugado do catálogo?". Dica: GROUP BY, ORDER BY ... DESC e LIMIT 1.

Tarefa opcional: transforme uma das suas consultas de hoje numa pergunta que o dono do negócio faria de verdade, e escreva a resposta em uma frase em português — como num relatório.

Para treinar: locadora-exercicios-14-juncoes.sql, na página da aula — oito perguntas, incluindo a armadilha do WHERE que desfaz o LEFT JOIN.

Aula 14 · 27/10/2026 · Indicadores 3, 5
UC2 · Implementar Banco de Dados

Para a próxima aula

Vocês escreveram consultas ótimas hoje. Como guardar uma consulta com nome, para não reescrever toda vez?

Aula 14 · 27/10/2026 · Indicadores 3, 5
← todas as aulas