Eu não uso a sintaxe USING, pois
- 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
- 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.