Sintaxe JOIN
O MariaDB 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 MariaDB 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_aliasounome_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áusulaWHERE. - Se não houver registros coincidentes para a tabela a direita da parte
ONouUSINGem umLEFT JOIN, uma linha comNULLatribuí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 tabelamysql>
SELECT tabela1.* FROM tabela1->LEFT JOIN tabela2 ON tabela1.id=tabela2.id->WHERE tabela2.id IS NULL;Este exemplo encontra todas as linhas em
tabela1com um valoridque não está presente emtabela2(isto é, toda as linhas emtabela1sem linha correspondente emtabela2). Assume-se quetabela2.idé declaradaNOT NULL. Leia "Como o MariaDB OtimizaLEFT JOINeRIGHT 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] JOINde duas tabelas é definido para ser semanticamente equivalente a umINNER JOINou umLEFT JOINcom uma cláusulaUSINGque nomeia todas as colunas que exitem em ambas as tabelas. INNER JOINe,(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 JOINfunciona de forma análoga a umLEFT JOIN. Para manter o código portável entre banco de dados, é recomendado usarLEFT JOINem vez deRIGHT JOIN.STRAIGHT_JOINé identico aJOIN, 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 MariaDB deve us quando retornar informações de uma tabela. Isto é útil se
EXPLAINmostar que o MariaDB está utilizando o índice errado da lista de índices possíveis. EspecificandoUSE INDEX (lista_indice), você pode dizer ao MariaDB para usar somente um dos índices possíveis para encontrar registros em uma tabela. A sintaxe alternativaIGNORE INDEX (lista_indice)pode ser usado para dizer ao MariaDB para não utilizar índices particulares.Na versão 4.0.9 do MariaDB você também pode utilizar
FORCE INDEX. Ele funciona comoUSE 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 KEYsão sinônimos deUSE/IGNORE INDEX.
Nota: USE/IGNORE/FORCE INDEX afeta apenas os índices usados quando o MariaDB 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 "Como o MariaDB Otimiza LEFT JOIN e RIGHT JOIN".