Enquanto o INNER JOIN retorna apenas linhas onde há uma correspondência em ambas as tabelas, há muitos cenários em que você deseja manter todos os registros de uma tabela, mesmo que eles não tenham uma correspondência na outra. É exatamente isso que o LEFT JOIN (também conhecido como LEFT OUTER JOIN) faz.
Um LEFT JOIN retorna todas as linhas da tabela da "esquerda" (a mencionada primeiro na consulta) e as linhas correspondentes da tabela da "direita" (a mencionada após a palavra-chave JOIN).
Se não houver correspondência na tabela da direita para uma linha específica na tabela da esquerda, o banco de dados ainda retornará a linha da tabela da esquerda, mas colocará NULL em todas as colunas vindas da tabela da direita.
Visualização:
Tabela A (customer) Tabela B (payment)
+----+----------+ +----+----------+
| id | name | | id | amount |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Correspondência!)
| 2 | Bob | <--------> | 1 | 15.00 | (Correspondência!)
| 3 | Charlie | <--------? | NULL | (Sem correspondência, mantém Charlie!)
+----+----------+ +----+----------+
Neste exemplo, Charlie é incluído nos resultados mesmo que não tenha pagamentos. O "amount" para sua linha será NULL.
A sintaxe para um LEFT JOIN é idêntica à do INNER JOIN, mas com uma palavra-chave diferente:
SELECT
table1.column1,
table2.column2
FROM
table1
LEFT JOIN
table2 ON table1.common_column = table2.common_column;
LEFT JOIN: Garante que todas as linhas da table1 (a tabela da esquerda) sejam mantidas.ON: A condição para a correspondência.Nota:
LEFT JOINeLEFT OUTER JOINsão a mesma coisa. A palavra-chaveOUTERé opcional.
Suponha que queiramos uma lista de todos os clientes, incluindo aqueles que nunca fizeram um pagamento. Um INNER JOIN filtraria os clientes sem pagamentos, mas um LEFT JOIN os mantém.
SELECT
c.first_name,
c.last_name,
p.amount
FROM
customer AS c
LEFT JOIN
payment AS p ON c.customer_id = p.customer_id
ORDER BY
p.amount ASC;
Se você vir linhas onde amount é NULL, esses são clientes que não possuem registros de pagamento.
Vamos encontrar todas as cópias de filmes (inventário) e verificar se elas já foram alugadas.
SELECT
i.inventory_id,
f.title,
r.rental_id
FROM
inventory AS i
JOIN
film AS f ON i.film_id = f.film_id
LEFT JOIN
rental AS r ON i.inventory_id = r.inventory_id
WHERE
r.rental_id IS NULL;
Ao usar LEFT JOIN e filtrar por r.rental_id IS NULL, podemos encontrar itens específicos em nosso inventário que nunca foram alugados.
LEFT JOIN, a tabela listada após FROM é a tabela da "Esquerda". Se você inverter as tabelas, o resultado muda completamente.LEFT JOIN, o código da sua aplicação precisa estar pronto para lidar com valores NULL nos resultados.WHERE que faça referência à tabela da direita, poderá acidentalmente transformar seu LEFT JOIN em um INNER JOIN (esta é uma armadilha comum do SQL).INNER JOIN, a ordem das tabelas na consulta impacta significativamente o resultado.