SQL INNER JOIN: Combinar Linhas Correspondentes
Lição 5.2 · Tempo de leitura: ~6 min · Tarefas para praticar ↓
O SQL INNER JOIN combina linhas de duas tabelas e devolve apenas os pares em que a condição de junção é verdadeira, ou seja, linhas que têm correspondência nas duas tabelas. Nesta lição, você vai aprender a sintaxe do INNER JOIN, por que os alias de tabelas importam, como juntar três tabelas e o que acontece às linhas sem correspondência.
Na lição anterior, você viu por que os dados ficam divididos em várias tabelas e como as chaves as ligam. O INNER JOIN é a forma mais comum de juntar os dados de novo: uma cidade com o seu país, um pagamento com o seu cliente, um ator com os seus filmes.
O Que o INNER JOIN Devolve
O INNER JOIN verifica a condição de junção para pares de linhas das duas tabelas e mantém apenas os pares em que ela é verdadeira.
- Uma linha da primeira tabela sem linha correspondente na segunda não aparece no resultado.
- Uma linha da segunda tabela sem correspondência também não aparece.
- Uma linha com várias correspondências aparece várias vezes, uma por correspondência.
Por isso, o INNER JOIN costuma ser descrito como a interseção de duas tabelas.
Sintaxe Básica
SELECT table1.column1, table2.column2
FROM table1
INNER JOIN table2 ON table1.key_column = table2.key_column;
INNER JOINindica a segunda tabela.ONdefine a condição de junção, normalmente "chave estrangeira = chave primária".- A palavra-chave
INNERé opcional:JOINsozinho significaINNER JOIN.
Juntar Duas Tabelas
A tabela city guarda country_id, uma referência à tabela country. Para ver o nome do país ao lado de cada cidade:
SELECT city.city, country.country
FROM city
INNER JOIN country ON city.country_id = country.country_id
ORDER BY country.country, city.city;
Resultado: 600 cidades, cada uma com o nome do seu país.
Quando as duas tabelas têm uma coluna com o mesmo nome, como country_id aqui, é preciso prefixá-la com o nome da tabela; caso contrário, o banco de dados reporta uma coluna ambígua.
Alias de Tabelas
Nomes de tabelas longos tornam as junções difíceis de ler. Um alias de tabela é um nome curto definido depois da tabela:
SELECT ci.city, co.country
FROM city AS ci
INNER JOIN country AS co ON ci.country_id = co.country_id
ORDER BY co.country, ci.city;
O resultado é o mesmo. Quando uma tabela tem um alias, use o alias em toda a consulta. Escolha alias curtos mas significativos: ci e co são mais fáceis de acompanhar do que a e b.
Juntar Três Tabelas
Um ator pode participar de muitos filmes, e um filme tem muitos atores. Uma relação muitos-para-muitos assim é guardada numa tabela de ligação: film_actor contém pares (actor_id, film_id). Para listar atores com os títulos dos filmes, junte as três tabelas:
SELECT a.first_name, a.last_name, f.title
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
ORDER BY a.last_name, a.first_name, f.title
LIMIT 10;
Resultado: os 10 primeiros pares ator–filme em ordem alfabética dos atores.
- A primeira junção acrescenta as linhas de
film_actorde cada ator. - A segunda junção acrescenta o filme de cada uma dessas linhas.
- Cada
JOINtrabalha com o resultado do anterior, então é possível encadear quantas tabelas forem necessárias.
Combinar JOIN com WHERE e ORDER BY
Uma junção é seguida pelas cláusulas já conhecidas. Por exemplo, os filmes com Nick Wahlberg:
SELECT f.title, f.release_year, f.rating
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
WHERE a.first_name = 'NICK'
AND a.last_name = 'WAHLBERG'
ORDER BY f.title;
Resultado: os títulos, anos de lançamento e classificações de todos os filmes com este ator.
Linhas Sem Correspondência Desaparecem
O INNER JOIN descarta silenciosamente as linhas sem correspondência. O Sakila tem 1000 filmes, mas apenas 958 deles têm cópias na tabela inventory:
SELECT f.title, i.inventory_id, i.store_id
FROM film AS f
INNER JOIN inventory AS i ON i.film_id = f.film_id
ORDER BY f.title
LIMIT 10;
Resultado: filmes com as suas cópias; 42 filmes sem cópias não aparecem, e um filme com várias cópias aparece várias vezes.
Quando as linhas sem correspondência precisam permanecer no resultado, use LEFT JOIN, que você vai aprender na próxima lição.
Principais conclusões:
- O
INNER JOINdevolve apenas os pares de linhas que satisfazem a condiçãoON. - Linhas sem correspondência na outra tabela são descartadas; linhas com várias correspondências são repetidas.
JOINeINNER JOINsão a mesma coisa.- Use alias de tabelas e prefixe as colunas que existem nas duas tabelas.
- Encadeie vários
JOINs para atravessar tabelas de ligação comofilm_actor.
Perguntas Frequentes
Qual é a diferença entre JOIN e INNER JOIN?
Nenhuma. JOIN sem tipo é um INNER JOIN em todos os principais bancos de dados. Escrever INNER JOIN explicitamente deixa a intenção mais clara quando a consulta mistura tipos de junção diferentes.
Por que o meu INNER JOIN devolve linhas duplicadas?
Porque uma linha tem várias correspondências na outra tabela. Um filme com quatro cópias em inventory aparece quatro vezes depois de juntar film e inventory. É o comportamento correto da junção; agregue ou filtre se precisar de uma linha por filme.
É possível juntar mais de duas tabelas em SQL?
Sim. Adicione um JOIN ... ON ... por tabela. Cada junção liga uma nova tabela às tabelas que já foram juntadas.