Em um MySQL JOIN
, qual é a diferença entre ON
e USING()
? Tanto quanto posso dizer, USING()
é apenas uma sintaxe mais conveniente, enquanto ON
permite um pouco mais de flexibilidade quando os nomes das colunas não são idênticos. No entanto, essa diferença é tão pequena que você pensaria que eles acabariam com isso USING()
.
Existe mais do que aparenta? Se sim, qual devo usar em uma determinada situação?
using
tem outro uso além de junções. Veja stackoverflow.com/a/13750399/632951Respostas:
É principalmente açúcar sintático, mas algumas diferenças são dignas de nota:
ON é o mais geral dos dois. Pode-se juntar tabelas em uma coluna, um conjunto de colunas e até uma condição. Por exemplo:
USING é útil quando ambas as tabelas compartilham uma coluna com o mesmo nome exato em que se juntam. Nesse caso, pode-se dizer:
Uma boa sugestão adicional é que não é necessário qualificar totalmente as colunas de junção:
Para ilustrar, para fazer o acima com ON , teríamos que escrever:
Observe a
film.film_id
qualificação naSELECT
cláusula. Seria inválido dizer apenasfilm_id
uma vez que isso criaria uma ambiguidade:Quanto a
select *
, a coluna de junção aparece no conjunto de resultados duas vezes comON
enquanto aparece apenas uma vez comUSING
:fonte
USING
interpreta paraON
.USING(
categoria,
FIELD_ID)
que é útil quando se juntar por chaves primárias compostas, também eu ouvi que o otimizador faz usoUSING
para melhorar o desempenho em alguns casosUSING
uma definição do MySQL ou é padrão?Achei que iria me interessar aqui quando achar
ON
mais útil do queUSING
. É quando asOUTER
junções são introduzidas nas consultas.ON
se beneficia de permitir que o conjunto de resultados da tabela ao qual uma consulta estáOUTER
ingressando seja restrito, mantendo aOUTER
associação. Tentar restringir os resultados definidos através da especificação de umaWHERE
cláusula, efetivamente, transformará aOUTER
associação em umaINNER
associação.Concedido que este pode ser um caso de canto relativo. Vale a pena colocar lá fora ...
Por exemplo:
fonte
using
oferecidas, ele não pode ser combinado com outros predicados:select*from t join t2 using(i) and on 1
não funcionaria.where hasAirport ;
- O que isto significa ? nenhum valor existe para comparar.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
listará todos os países, mas apenas as cidades que começam com C ou D (se houver). (Mais cidades chamadas 'E')A Wikipedia possui as seguintes informações sobre
USING
:Tabelas sobre as quais estava falando:
A documentação do Postgres também os define muito bem:
fonte
Para aqueles que experimentam isso no phpMyAdmin, apenas uma palavra:
O phpMyAdmin parece ter alguns problemas
USING
. Para registro, este é o phpMyAdmin, executado no Linux Mint, versão: "4.5.4.1deb2ubuntu2", servidor de banco de dados: "10.2.14-MariaDB-10.2.14 + maria ~ xenial - distribuição binária mariadb.org".Eu executei
SELECT
comandos usandoJOIN
eUSING
no phpMyAdmin e no Terminal (linha de comando), e os do phpMyAdmin produzem algumas respostas desconcertantes:1) uma
LIMIT
cláusula no final parece ser ignorada.2) o número suposto de linhas, conforme relatado na parte superior da página com os resultados, às vezes está errado: por exemplo, 4 são retornados, mas na parte superior diz "Mostrando linhas 0 - 24 (total de 2503, a consulta demorou 0,0018 segundos). "
Efetuar logon no mysql normalmente e executar as mesmas consultas não produz esses erros. Esses erros também não ocorrem ao executar a mesma consulta no phpMyAdmin usando
JOIN ... ON ...
. Presumivelmente um bug do phpMyAdmin.fonte