O MySQL suporta as seguintes sintaxes JOIN
para uso em instruções SELECT
:
tabela_ref, tabela_ref tabela_ref [INNER | CROSS] JOIN table_reference [join_condition] tabela_ref STRAIGHT_JOIN tabela_ref tabela_ref LEFT [OUTER] JOIN table_reference [join_condition] tabela_ref NATURAL [LEFT [OUTER]] JOIN tabela_ref { OJ tabela_ref LEFT OUTER JOIN tabela_ref ON expr_condicional } tabela_ref RIGHT [OUTER] JOIN table_reference [join_condition] tabela_ref NATURAL [RIGHT [OUTER]] JOIN tabela_ref
Onde tabela_ref
é definido como:
nome_tabela [[AS] alias] [[USE INDEX (lista_indice)] | [IGNORE INDEX (lista_indice)] | [FORCE INDEX (lista_indice)]]
a condição_join
é definido como:
ON expr_condicional | USING (lista_colunas)
Geralamente você não deverá ter nenhuma condição na parte
ON
que é usada para restringir quais
registros você terá no seu resultado, mas ao invés disto,
especificar estas condições na cláusula
WHERE
. Existem exceções para isto.
Note que a sintaxe INNER JOIN
permite uma
condição_join
apenas a partir da versão
3.23.17. O mesmo acontece para JOIN
e
CROSS JOIN
apenas a partir do MySQL 4.0.11.
A última sintaxe LEFT OUTER JOIN
mostrada
na lista anterior só existe para compatibilidade com ODBC:
Pode se usar um alias para referência a tabelas com
nome_tabela AS nome_alias
ou
nome_tabela nome_alias
:
mysql>SELECT t1.nome, t2.salario FROM funcionarios AS t1, info AS t2
->WHERE t1.nome = t2.nome;
A condicional ON
é qualquer condição
da forma que pode ser usada em uma cláusula
WHERE
.
Se não houver registros coincidentes para a tabela a
direita da parte ON
ou
USING
em um LEFT
JOIN
, uma linha com NULL
atribuído a todas as colunas é usada para a tabela a
direita. Você pode usar este fato para encontrar registro
em uma tabela que não houver contrapartes em outra tabela
mysql>SELECT tabela1.* FROM tabela1
->LEFT JOIN tabela2 ON tabela1.id=tabela2.id
->WHERE tabela2.id IS NULL;
Este exemplo encontra todas as linhas em
tabela1
com um valor
id
que não está presente em
tabela2
(isto é, toda as linhas em
tabela1
sem linha correspondente em
tabela2
). Assume-se que
tabela2.id
é declarada NOT
NULL
. See
Secção 5.2.7, “Como o MySQL Otimiza LEFT JOIN
e RIGHT
JOIN
”.
A cláusula USING
(lista_colunas)
nomeia uma lista de
colunas que devem existir em ambas as tabelas. As
seguintes duas cláusulas são semanticamente idênticas:
a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
Um NATURAL [LEFT] JOIN
de duas tabelas
é definido para ser semanticamente equivalente a um
INNER JOIN
ou um LEFT
JOIN
com uma cláusula USING
que nomeia todas as colunas que exitem em ambas as
tabelas.
INNER JOIN
e ,
(vírgula) são semanticamente equivalentes na ausência
da condição join: ambos produzirão um produto
Cartesiano entre as tabelas especificadas. (isto é, todos
os registros na primeira tabela serão ligados com todos
os registros na segunda tabela).
RIGHT JOIN
funciona de forma análoga a
um LEFT JOIN
. Para manter o código
portável entre banco de dados, é recomendado usar
LEFT JOIN
em vez de RIGHT
JOIN
.
STRAIGHT_JOIN
é identico a
JOIN
, exceto pelo fato de que a tabela
de esquerda sempre é lida antes da tabela da direita. Ele
pode ser usado para aqueles casos (poucos) onde o
otimizador join coloca as tabelas na ordem errada.
Como na versão 3.23.12, você pode dar sugestões sobre
qual índice o MySQL deve us quando retornar informações
de uma tabela. Isto é útil se EXPLAIN
mostar que o MySQL está utilizando o índice errado da
lista de índices possíveis. Especificando USE
INDEX (lista_indice)
, você pode dizer ao MySQL
para usar somente um dos índices possíveis para
encontrar registros em uma tabela. A sintaxe alternativa
IGNORE INDEX (lista_indice)
pode ser
usado para dizer ao MySQL para não utilizar índices
particulares.
Na versão 4.0.9 do MySQL você também pode utilizar
FORCE INDEX
. Ele funciona como
USE INDEX (key_list)
mas com assume que
uma varredura na tabela é MUITO cara. Em outras palavras,
uma varredura na tabela só será feita se não houver
modo de uitlizar um dos índices fornecidos para se
enecontrar registros no tabela.
USE/IGNORE KEY
são sinônimos de
USE/IGNORE INDEX
.
Nota:
USE/IGNORE/FORCE INDEX
afeta apenas os
índices usados quando o MySQL decide como encontrar registros
na tabela e como fazer a ligação. Ele não tem efeito se um
índice será usado ao resolver um ORDER BY
ou GROUP BY
.
Alguns exemplos:
mysql>SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id;
mysql>SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id;
mysql>SELECT * FROM tabela1 LEFT JOIN tabela2 USING (id);
mysql>SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id
->LEFT JOIN tabela3 ON tabela2.id=tabela3.id;
mysql>SELECT * FROM tabela1 USE INDEX (chave1,chave2)
->WHERE chave1=1 AND chave2=2 AND chave3=3;
mysql>SELECT * FROM tabela1 IGNORE INDEX (chave3)
->WHERE chave1=1 AND chave2=2 AND chave3=3;
See Secção 5.2.7, “Como o MySQL Otimiza LEFT JOIN
e RIGHT
JOIN
”.
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.