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


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

SQL
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

100%
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

SQL
-- 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;
▶ Experimente

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

SQL
-- 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;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+----------+----------+--------+
| 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

SQL
SELECT c.*
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.id IS NULL;
▶ Experimente

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

SQL
-- 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;
▶ Experimente
💡 Dica: O RIGHT JOIN raramente é usado; geralmente pode ser substituído por um LEFT JOIN (invertendo a ordem das tabelas).


7. CROSS JOIN

Retorne o produto cartesiano (linha por linha).

▶ Exemplo: Conexão cruzada

SQL
-- Generate Colors×Size Combinations
SELECT c.color, s.size
FROM colors c
CROSS JOIN sizes s;
▶ Experimente

Resultado (3 cores × 3 tamanhos = 9 linhas):

TEXT 📖 Somente leitura
+-------+------+
| color | size |
+-------+------+
| Red   | S    |
| Red   | M    |
| Red   | L    |
| Blue  | S    |
| Blue  | M    |
| Blue  | L    |
| Green | S    |
| Green | M    |
| Green | L    |
+-------+------+

Uma tabela está associada a si mesma.

▶ Exemplo: Como localizar um funcionário e seu supervisor

SQL
-- 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;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+----------+---------+
| 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 para INNER JOIN.

P: É possível usar LEFT JOIN e RIGHT JOIN de forma intercambiável? R: Sim. A LEFT JOIN B é equivalente a B 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


📝 Exercícios

  1. Questão básica (Dificuldade: ⭐): Use um INNER JOIN para recuperar os pedidos e os nomes dos clientes correspondentes.

  2. Problema avançado (Dificuldade: ⭐⭐): Use um LEFT JOIN para identificar os clientes que nunca fizeram um pedido.

  3. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%