Lição 5.8: Cenários e Técnicas Práticas de JOIN
Até agora, exploramos a mecânica de diferentes tipos de junção. Nesta lição, iremos além do básico e veremos como aplicar as junções para resolver problemas de negócios comuns, lidar com múltiplas tabelas e combinar junções com agregação.
1. Unindo Múltiplas Tabelas (3+)
Em bancos de dados complexos, os dados de que você precisa estão frequentemente distribuídos em três ou mais tabelas conectadas por tabelas de junção (junction tables).
Cenário: Queremos ver uma lista de atores e os títulos dos filmes em que apareceram.
Isso requer três tabelas: actor, film_actor (a ponte) e film.
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
ORDER BY
a.last_name
LIMIT 10;
Como funciona:
- Cada
JOINcria uma nova tabela virtual que o próximoJOINpode usar. - A ordem das junções geralmente segue o caminho de relacionamento no ERD (Diagrama do Banco de Dados).
2. Usando Funções Agregadas com JOINs
Um dos usos mais poderosos das junções é calcular estatísticas em tabelas relacionadas. Você pode usar funções como COUNT, SUM e AVG após a junção.
Cenário: Calcular o valor total gasto por cada cliente.
SELECT
c.first_name,
c.last_name,
SUM(p.amount) AS total_gasto
FROM
customer AS c
INNER JOIN
payment AS p ON c.customer_id = p.customer_id
GROUP BY
c.customer_id, c.first_name, c.last_name
ORDER BY
total_gasto DESC;
Nota: Ao usar GROUP BY com junções, sempre inclua a chave primária (customer_id) para garantir resultados únicos caso dois clientes tenham o mesmo nome.
3. Encontrando Dados Ausentes (O "Anti-Join")
Podemos usar o LEFT JOIN combinado com uma cláusula WHERE para encontrar registros que não possuem uma entrada correspondente em outra tabela.
Cenário: Encontrar todos os filmes que NÃO estão no nosso inventário no momento (significa que temos o registro, mas não temos cópias físicas).
SELECT
f.title
FROM
film AS f
LEFT JOIN
inventory AS i ON f.film_id = i.film_id
WHERE
i.inventory_id IS NULL;
4. A Armadilha do Filtro: WHERE vs. ON
Um erro comum é colocar um filtro na cláusula WHERE ao usar um LEFT JOIN, o que acidentalmente o transforma de volta em um INNER JOIN.
Incorreto:
-- Isso remove clientes sem pagamentos porque p.payment_date é verificado APÓS a junção
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
WHERE p.payment_date > '2005-08-01';
Correto (mantendo todos os clientes):
-- Isso mantém todos os clientes, mas só une dados de pagamento que correspondam à data
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
AND p.payment_date > '2005-08-01';
Principais Conclusões desta Lição
- Encadeamento de Junções: Você pode unir quantas tabelas forem necessárias adicionando mais instruções
JOIN. - Relatórios: Combinar
JOINcomGROUP BYpermite relatórios complexos entre entidades de negócios. - Auditoria de Dados: Use
LEFT JOIN ... WHERE ... IS NULLpara encontrar lacunas em seus dados. - Precisão Lógica: Tenha cuidado onde coloca seus filtros (em
ONvs.WHERE) ao trabalhar com junções externas.