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_alias
ounome_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
ON
ouUSING
em umLEFT JOIN
, uma linha comNULL
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 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
tabela1
com um valorid
que não está presente emtabela2
(isto é, toda as linhas emtabela1
sem linha correspondente emtabela2
). Assume-se quetabela2.id
é declaradaNOT NULL
. Leia "Como o MariaDB OtimizaLEFT JOIN
eRIGHT 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 umINNER JOIN
ou umLEFT JOIN
com uma cláusulaUSING
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 umLEFT JOIN
. Para manter o código portável entre banco de dados, é recomendado usarLEFT JOIN
em 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
EXPLAIN
mostar 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 KEY
sã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
".