Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Qual é a diferença entre usar e em junções de tabela no MySQL?


Eu não uso a sintaxe USING, pois
  1. a maioria das minhas junções não é adequada para isso (não é o mesmo nome de campo que está sendo correspondido e/ou várias correspondências na junção) e
  2. não é imediatamente óbvio o que significa no caso de mais de duas tabelas

ou seja, assumindo 3 tabelas com colunas 'id' e 'id_2', não
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

vir a ser
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

ou
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

ou outra coisa de novo?

Descobrir isso para uma versão de banco de dados específica é um exercício bastante trivial, mas não tenho muita confiança de que seja consistente em todos os bancos de dados e não sou a única pessoa que precisa manter meu código (portanto, o outras pessoas também terão que estar cientes do que é equivalente).

Uma diferença óbvia com WHERE vs ON é se a junção for externa:

Assumindo um T1 com um único campo de ID, uma linha contendo o valor 1 e um T2 com um campo de ID e VALOR (uma linha, ID=1, VALUE=6), então temos:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

não fornece linhas, pois WHERE é necessário para corresponder, enquanto
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

vai dar uma linha com os valores
1, NULL, NULL

já que o ON só é necessário para combinar a junção, que é opcional por ser externa.