A LEFT JOIN B join_condition no MySQL está
implementada como a seguir:
A tabela B é configurada para ser
dependente da tabela A e de todas as
tabelas das quais A depende.
A tabela A é configurada para ser
dependente de todas as tabelas (exceto B)
que são usadas na condição LEFT JOIN.
A condição LEFT JOIN é usada para
decidir como devemos recuperar registros a partir da tabela
B. (Em outras palavras, qualquer condição na claúsula
WHERE não é usada).
Todas as otimizações padrões de join são feitas, com a excessão que uma tabela é sempre lida depois de todas as tabelas das quais é dependente. Se existir uma dependência circular o MySQL irá emitir um erro.
Todas as otimizações padrões de WHERE
são realizadas.
Se existir um registro em A que coincida
com a cláusula WHERE, mas não existir
nenhum registro em B que coincida com a
condição ON então um registro extra em
B é gerado com todas as colunas com
valor NULL.
Se você utiliza LEFT JOIN para encontrar
registros que não existem em alguma tabela e está usando o
seguinte teste: nome_coluna IS NULL na
parte WHERE, onde nome_colun é um campo
que é declarado como NOT NULL, então o
MySQL para de pesquisar por mais registros (para uma
combinação particular de chaves) depois de ter encontrado
um registro que combinar com a condição LEFT
JOIN.
RIGHT JOIN é implementado de forma análoga
à LEFT JOIN.
A ordem de leitura das tabelas forçada por LEFT
JOIN e STRAIGHT JOIN irá ajudar o
otimizador de joins (que calcula em qual ordem as tabelas devem
ser unidas) a fazer seu trabalho mais rapidamente, já que
haverão poucas permutações de tabelas a serem conferidas.
Perceba que o texto acima significa que se você fizer uma consulta do tipo:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
A partir do MySQL 4.0.14, o MySQL faz a seguinte otimização
LEFT JOIN:
Se a condição WHERE é sempre falsa para a
linha NULL gerada, o LEFT
JOIN é alterado para um join normal.
Por exemplo, na seguinte consulta a cláusula
WHERE seria falso se t2.coluna fosse
NULL, asssim é seguro converter para uma
join normal.
SELECT * FROM t1 LEFT t2 ON (column) WHERE t2.column2 =5; -> SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column=t2.column;
Isto pode ser feito mais rápido já que o MySQL pode agora usar
a tabela t2 antes da tabela
t1 se resultasse consulta melhor. Para
forçar uma ordem de tabela específica, use STRAIGHT
JOIN.
O MySQL irá fazer uma pesquisa completa em b
já que o LEFT JOIN irá força-lo a ser lido
antes de d.
A correção neste caso é alterar a consulta para:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
