// aula 03 · SQL · JOINs

JOINs — Unindo tabelas
em uma consulta


Tabelas de exemplo

clientes

idnome
1'Ana'
2'Carlos'
3'Maria'
4'João'

pedidos

idcliente_idvalor
1011250.00
102180.00
1032430.00
1045120.00

A chave que une as tabelas

A coluna cliente_id na tabela pedidos é uma chave estrangeira (FK) que referencia o id da tabela clientes. É essa relação que o JOIN usa para cruzar os dados.


INNER JOIN — a intersecção

INNER JOIN

Só o que existe nos dois lados

Retorna apenas as linhas que têm correspondência nas duas tabelas. No exemplo: Ana e Carlos têm pedidos, João não tem → João não aparece. O pedido 104 tem cliente_id=5 (não existe) → também não aparece.

SELECT
  c.nome,
  p.id    AS pedido,
  p.valor
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id;

-- Resultado:
-- Ana    | 101 | 250.00
-- Ana    | 102 | 80.00
-- Carlos | 103 | 430.00

LEFT JOIN — todos da esquerda

LEFT JOIN

Todos da tabela da esquerda, com ou sem correspondência

Retorna todos os registros da tabela esquerda (FROM) e os correspondentes da direita. Onde não há correspondência, preenche com NULL. Perfeito para encontrar registros sem par — ex: clientes sem pedidos.

SELECT
  c.nome,
  p.id    AS pedido,
  p.valor
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id;

-- Resultado:
-- Ana    | 101  | 250.00
-- Ana    | 102  | 80.00
-- Carlos | 103  | 430.00
-- Maria  | NULL | NULL   ← sem pedidos
-- João   | NULL | NULL   ← sem pedidos

-- Clientes SEM nenhum pedido:
SELECT c.nome FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.id IS NULL;

RIGHT JOIN — todos da direita

RIGHT JOIN

Todos da tabela da direita, com ou sem correspondência

O espelho do LEFT JOIN — retorna todos da tabela direita (JOIN) e os correspondentes da esquerda. Na prática, pode sempre ser reescrito como um LEFT JOIN trocando a ordem das tabelas. É menos usado.

SELECT c.nome, p.id, p.valor
FROM clientes c
RIGHT JOIN pedidos p ON c.id = p.cliente_id;

-- Resultado: todos os pedidos, com ou sem cliente
-- Ana    | 101 | 250.00
-- Ana    | 102 | 80.00
-- Carlos | 103 | 430.00
-- NULL   | 104 | 120.00  ← cliente_id=5 não existe

FULL OUTER JOIN — tudo de ambos os lados

FULL OUTER JOIN

União completa — todos os registros dos dois lados

Retorna todos os registros das duas tabelas. Onde não há correspondência, preenche com NULL. No MySQL não existe diretamente — é simulado com LEFT JOIN + UNION + RIGHT JOIN.

-- SQL Server / PostgreSQL
SELECT c.nome, p.id, p.valor
FROM clientes c
FULL OUTER JOIN pedidos p ON c.id = p.cliente_id;

-- MySQL (simulado com UNION)
SELECT c.nome, p.id, p.valor
FROM clientes c LEFT JOIN pedidos p ON c.id = p.cliente_id
UNION
SELECT c.nome, p.id, p.valor
FROM clientes c RIGHT JOIN pedidos p ON c.id = p.cliente_id;

Múltiplos JOINs na mesma query

Encadeando tabelas

É possível unir quantas tabelas precisar em uma única query. Cada JOIN adiciona uma nova tabela. O banco vai cruzando as relações em cadeia.

-- clientes → pedidos → produtos → categorias
SELECT
  c.nome      AS cliente,
  p.valor     AS pedido,
  pr.nome     AS produto,
  cat.nome    AS categoria
FROM clientes c
INNER JOIN pedidos p        ON c.id       = p.cliente_id
INNER JOIN itens_pedido ip  ON p.id       = ip.pedido_id
INNER JOIN produtos pr      ON ip.prod_id = pr.id
INNER JOIN categorias cat   ON pr.cat_id  = cat.id
WHERE c.id = 1
ORDER BY p.valor DESC;