MySQL: O Guia Completo sobre Junções no MySQL
Última atualização: 2026-08-26
A JOIN é uma funcionalidade essencial dos bancos de dados relacionais — ela só demonstra verdadeiramente seu poder quando várias tabelas são unidas.
Esta aula oferece uma visão geral sistemática de todos os tipos de JOIN e suas aplicações práticas.
1. O que você vai aprender
- INNER JOIN (junção interna)
- LEFT JOIN / RIGHT JOIN (junção externa)
- CROSS JOIN
- Auto-vinculação
- Sintaxe do USING
2. Uma história real sobre consultas em várias tabelas
(1) Problema: os dados estão espalhados por várias tabelas
Os dados dos pedidos são armazenados na tabela orders, e os nomes dos clientes são armazenados na tabela customers.
Para encontrar o “nome do cliente associado a cada pedido”, você precisará executar uma consulta com junção.
(2) Soluções para JOINs
SELECT
o.id AS order_id,
c.name AS customer_name,
o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
3. Visão geral dos tipos de JOIN
graph LR
A[JOIN Type] --> B[INNER JOIN]
A --> C[LEFT JOIN]
A --> D[RIGHT JOIN]
A --> E[CROSS JOIN]
B --> F[Return only matching rows]
C --> G[Full Refund on the Left Table+Right Table Match]
D --> H[Full refund as shown in the table on the right+Left Table Match]
E --> I[Cartesian product]
| Tipo de JOIN | Descrição | Número de linhas retornadas |
|---|---|---|
| INNER JOIN | Linhas que coincidem nas duas tabelas | Interseção |
| LEFT JOIN | Tabela esquerda inteira + linhas correspondentes da tabela direita | Tabela esquerda inteira |
| RIGHT JOIN | Tabela direita inteira + linhas correspondentes da tabela esquerda | Tabela direita inteira |
| CROSS JOIN | Produto cartesiano | m × n |
4. INNER JOIN
Retorne apenas as linhas que coincidem nas duas tabelas.
▶ Exemplo: Inner Join básico
-- Check Order and Customer Information
SELECT
o.id AS order_id,
c.name AS customer_name,
o.amount,
o.order_date
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
-- Connection of the Three Tables
SELECT
o.id,
c.name,
p.product_name,
oi.quantity
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id;
5. LEFT JOIN (Junção externa à esquerda)
Retorna todas as linhas da tabela da esquerda; retorna NULL se não houver correspondências na tabela da direita.
▶ Exemplo: Left Join
-- Query all customers and their orders(Including customers with no orders)
SELECT
c.name,
o.id AS order_id,
o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
Saída:
+----------+----------+--------+
| name | order_id | amount |
+----------+----------+--------+
| Alice | 1 | 100.00 |
| Alice | 2 | 200.00 |
| Bob | 3 | 150.00 |
| Charlie | NULL | NULL | -- No orders
+----------+----------+--------+
▶ Exemplo: Encontrar clientes sem pedidos
SELECT c.*
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.id IS NULL;
6. RIGHT JOIN (Junção externa à direita)
Retorna todas as linhas da tabela à direita; retorna NULL se não houver correspondências na tabela à esquerda.
▶ Exemplo: Junção à direita
-- Query all orders and their customers(Including invalid orders)
SELECT
c.name,
o.id AS order_id,
o.amount
FROM customers c
RIGHT JOIN orders o ON c.id = o.customer_id;
7. CROSS JOIN
Retorne o produto cartesiano (linha por linha).
▶ Exemplo: Conexão cruzada
-- Generate Colors×Size Combinations
SELECT c.color, s.size
FROM colors c
CROSS JOIN sizes s;
Resultado (3 cores × 3 tamanhos = 9 linhas):
+-------+------+
| color | size |
+-------+------+
| Red | S |
| Red | M |
| Red | L |
| Blue | S |
| Blue | M |
| Blue | L |
| Green | S |
| Green | M |
| Green | L |
+-------+------+
9. Links internos
Uma tabela está associada a si mesma.
▶ Exemplo: Como localizar um funcionário e seu supervisor
-- The employee roster includes manager_id A field pointing to itself id
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
Saída:
+----------+---------+
| employee | manager |
+----------+---------+
| Alice | NULL | -- CEO,No superior
| Bob | Alice |
| Charlie | Alice |
| Dave | Bob |
+----------+---------+
10. Noções básicas sobre otimização de JOIN
| Estratégia de otimização | Descrição |
|---|---|
| Indexar o campo de junção | O campo em ON o.customer_id = c.id deve ser indexado |
| A tabela pequena alimenta a tabela grande | Coloque a tabela com o conjunto de resultados pequeno à esquerda |
Evitar SELECT * |
Pesquisar apenas nos campos obrigatórios |
| Filtragem WHERE | Reduz o número de linhas envolvidas na junção (JOIN) |
❓ Perguntas Frequentes
P: Existe alguma diferença entre INNER JOIN e JOIN? R: Não.
JOINé o padrão paraINNER JOIN.
P: É possível usar LEFT JOIN e RIGHT JOIN de forma intercambiável? R: Sim.
A LEFT JOIN Bé equivalente aB RIGHT JOIN A. Recomenda-se usar LEFT JOIN de forma consistente.
P: A operação JOIN é lenta? R: Depende do volume de dados e dos índices. Quando os campos de junção estão indexados, mesmo operações JOIN em tabelas com milhões de linhas podem retornar resultados em segundos.
P: Quantas tabelas podem ser unidas? R: Em teoria, não há limite no MySQL, mas, na prática, recomenda-se não ultrapassar 5 a 6 tabelas. Se houver tabelas demais, considere desnormalizar o projeto.
📖 Resumo
- INNER JOIN retorna as linhas correspondentes das duas tabelas
- LEFT JOIN retorna todas as linhas da tabela da esquerda, além das linhas correspondentes da tabela da direita (comumente utilizado)
- RIGHT JOIN retorna todas as linhas da tabela à direita, além das linhas correspondentes da tabela à esquerda
- CROSS JOIN retorna o produto cartesiano
- Autojunta: uma tabela é juntada a si mesma
- USING simplifica as junções que envolvem campos com o mesmo nome
- A indexação dos campos de junção é uma técnica fundamental de otimização
📝 Exercícios
-
Questão básica (Dificuldade: ⭐): Use um INNER JOIN para recuperar os pedidos e os nomes dos clientes correspondentes.
-
Problema avançado (Dificuldade: ⭐⭐): Use um LEFT JOIN para identificar os clientes que nunca fizeram um pedido.
-
Questão desafiadora (Dificuldade: ⭐⭐⭐): Use uma auto-junção para consultar os funcionários e seus supervisores e conte o número de subordinados gerenciados por cada supervisor.