O comando LEFT JOIN é utilizado para retornar todos os registros da tabela que está à esquerda da consulta, mesmo quando não existe correspondência na tabela da direita.
Ele é muito utilizado quando precisamos identificar registros que possuem ou não relacionamento.
No LEFT JOIN, a tabela escrita após o FROM é a tabela principal.
FROM clientes
LEFT JOIN pedidos
Todos os clientes serão exibidos, mesmo aqueles sem pedidos.
SELECT
tabela1.coluna,
tabela2.coluna
FROM tabela1
LEFT JOIN tabela2
ON tabela1.id = tabela2.id;
CLIENTES
+----+----------+
| ID | Nome |
+----+----------+
| 1 | Ana |
| 2 | Carlos |
| 3 | Pedro |
+----+----------+
PEDIDOS
+----+------------+-------+
| ID | Cliente_ID | Valor |
+----+------------+-------+
| 1 | 1 | 500 |
| 2 | 2 | 700 |
+----+------------+-------+
SELECT
clientes.nome,
pedidos.valor
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.cliente_id;
Resultado:
Ana | 500
Carlos | 700
Pedro | NULL
Pedro aparece mesmo sem possuir pedido cadastrado.
Podemos utilizar LEFT JOIN junto com WHERE para encontrar registros sem correspondência.
SELECT
clientes.nome
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.cliente_id
WHERE pedidos.id IS NULL;
Retorna clientes que nunca realizaram pedidos.
SELECT
c.nome,
p.valor
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id;
| LEFT JOIN | INNER JOIN |
|---|---|
| Mantém todos da esquerda | Somente correspondências |
| Pode retornar NULL | Não retorna NULL |
| Útil para encontrar ausências | Útil para dados relacionados |
SELECT
c.nome,
p.valor,
pr.nome
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id
LEFT JOIN produtos pr
ON p.produto_id = pr.id;
| Sistema | Utilização |
|---|---|
| E-commerce | Clientes sem compras |
| Banco | Contas sem movimentação |
| Escola | Alunos sem matrícula |
| RH | Funcionários sem registros |
| Erro | Problema |
|---|---|
| Trocar ordem das tabelas | Resultado diferente |
| Usar WHERE incorretamente | Elimina registros NULL |
| Relacionamento errado | Dados inconsistentes |
| Falta de índice | Consulta lenta |