O OUTER JOIN é utilizado para retornar registros de duas tabelas, incluindo também aqueles que não possuem correspondência entre elas.
Diferente do INNER JOIN, que retorna somente registros relacionados, o OUTER JOIN mantém informações sem relacionamento.
| Tipo | Descrição |
|---|---|
| LEFT OUTER JOIN | Mantém todos os registros da tabela esquerda |
| RIGHT OUTER JOIN | Mantém todos os registros da tabela direita |
| FULL OUTER JOIN | Mantém registros das duas tabelas |
| INNER JOIN | OUTER JOIN |
|---|---|
| Apenas registros relacionados | Inclui registros sem relação |
| Não retorna NULL | Pode retornar NULL |
| Mais restritivo | Mais abrangente |
CLIENTES
+----+----------+
| ID | Nome |
+----+----------+
| 1 | Ana |
| 2 | Carlos |
| 3 | Pedro |
+----+----------+
PEDIDOS
+----+------------+-------+
| ID | Cliente_ID | Valor |
+----+------------+-------+
| 1 | 1 | 500 |
| 2 | 2 | 700 |
| 3 | 5 | 300 |
+----+------------+-------+
Retorna todos os clientes e seus pedidos quando existirem.
SELECT
c.nome,
p.valor
FROM clientes c
LEFT OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
Ana | 500
Carlos | 700
Pedro | NULL
Retorna todos os pedidos e clientes relacionados quando existirem.
SELECT
c.nome,
p.valor
FROM clientes c
RIGHT OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
Ana | 500
Carlos | 700
NULL | 300
Retorna todos os registros das duas tabelas.
SELECT *
FROM clientes
FULL OUTER JOIN pedidos
ON clientes.id = pedidos.cliente_id;
O MySQL não possui FULL OUTER JOIN nativo.
Podemos simular utilizando UNION entre LEFT JOIN e RIGHT JOIN.
SELECT *
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id
UNION
SELECT *
FROM clientes c
RIGHT JOIN pedidos p
ON c.id = p.cliente_id;
| Sistema | Utilização |
|---|---|
| E-commerce | Encontrar clientes sem pedidos |
| Financeiro | Comparar lançamentos |
| RH | Comparar funcionários e departamentos |
| Relatórios | Conferência completa de dados |
| Erro | Problema |
|---|---|
| Confundir com INNER JOIN | Perda de registros |
| Não entender NULL | Resultados incorretos |
| Usar sem necessidade | Consultas mais pesadas |
| Relacionamento errado | Dados inconsistentes |