Qual é o comportamento padrão do MySQL JOIN, INNER ou OUTER?

91

Por isso, tenho navegado na internet a última hora, lendo e procurando a resposta definitiva para essa pergunta simples.

Qual é o JOIN padrão no MySQL?

SELECT * FROM t1 JOIN t2

Isso é o mesmo que

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Também uma questão relacionada, quando você usa cláusulas "WHERE", é o mesmo que JOIN ou INNER JOIN?

No momento, estou pensando que um JOIN independente é idêntico ao uso de vírgulas e cláusulas WHERE.

Quang Van
fonte

Respostas:

124

No MySQL, a escrita JOINnão qualificada implica INNER JOIN. Em outras palavras, o INNERin INNER JOINé opcional. INNERe CROSSsão sinônimos no MySQL. Para maior clareza eu escrevo JOINou INNER JOINse eu tiver uma condição de junção e CROSS JOINse eu não tiver uma condição.

A sintaxe permitida para junções é descrita na documentação .


No momento, estou pensando que um JOIN autônomo nada mais é do que (idêntico a) usar vírgulas e cláusulas WHERE.


O efeito é o mesmo, mas a história por trás deles é diferente. A sintaxe da vírgula é do padrão ANSI-89. No entanto, há vários problemas com essa sintaxe, portanto, no padrão ANSI-92, a palavra-chave JOIN foi introduzida.

Eu recomendo fortemente que você sempre use a sintaxe JOIN em vez da vírgula.

  • T1 JOIN T2 ON ...é mais legível do que T1, T2 WHERE ....
  • É mais fácil de manter porque os relacionamentos e os filtros da tabela são claramente definidos, em vez de misturados.
  • A sintaxe JOIN é mais fácil de converter em OUTER JOIN do que a sintaxe de vírgula.
  • Misturar a vírgula e a sintaxe JOIN na mesma instrução pode gerar erros curiosos devido às regras de precedência.
  • É menos provável criar acidentalmente um produto cartesiano ao usar a sintaxe JOIN devido a uma cláusula de junção esquecida, porque as cláusulas de junção são escritas ao lado das junções e é fácil ver se alguma está faltando.
Mark Byers
fonte
Legal, obrigado por esclarecer essa questão simples para mim :) No passado eu sempre usei vírgulas + cláusulas where ... mas irei converter para o uso de JOINs de acordo com seus conselhos. Obrigado
Quang Van
Ei, Mark, o que você quer dizer com combinações de JOIN e vírgulas. Misture consultas como esta, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Quang Van
2
@Quang: Isso, por exemplo, irá falhar:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers
0

Todos eles são equivalentes e também iguais a CROSS JOIN,.

Existem algumas diferenças entre o uso de vírgula e [INNER | CROSS] JOINsintaxe, o que pode ser importante ao juntar mais tabelas. Praticamente tudo que você precisa saber está descrito aqui na documentação do MySQLJOIN .

Mchl
fonte
1
^ --- a resposta à pergunta é JOIN (autônomo) basicamente é a mesma coisa que INNER e vírgula + cláusulas where
Quang Van