🚀 Novembro começou! O SQLtest.online continua gratuito graças às doações de pessoas como você. Ajude-nos a atingir a meta deste mês mais cedo para que o site continue funcionando sem interrupções. Apoiar agora →
Código SQL copiado para a área de transferência

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.

SQL INNER JOIN: as linhas de duas tabelas são emparelhadas pela condição de junção, e só aparecem no resultado as linhas com correspondência nas duas tabelas

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 JOIN indica a segunda tabela.
  • ON define a condição de junção, normalmente "chave estrangeira = chave primária".
  • A palavra-chave INNER é opcional: JOIN sozinho significa INNER 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.

  1. A primeira junção acrescenta as linhas de film_actor de cada ator.
  2. A segunda junção acrescenta o filme de cada uma dessas linhas.
  3. Cada JOIN trabalha 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 JOIN devolve apenas os pares de linhas que satisfazem a condição ON.
  • Linhas sem correspondência na outra tabela são descartadas; linhas com várias correspondências são repetidas.
  • JOIN e INNER JOIN sã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 como film_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.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Filmes clássicos
  2. Encontre endereços usando JOIN
  3. Encontre todos os atores no filme
  4. Encontre todos os filmes de um ator
  5. Encontre clientes que alugaram o filme