Nie używam składni USING, ponieważ
- Większość moich złączeń nie jest do tego dopasowana (nie jest to ta sama nazwa pola, która jest dopasowywana i/lub wiele dopasowań w złączeniu) i
- nie jest od razu oczywiste, na co to się przekłada w przypadku więcej niż dwóch tabel
tj. zakładając 3 tabele z kolumnami 'id' i 'id_2', nie
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
zostań
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
lub
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
czy coś jeszcze?
Ustalenie tego dla konkretnej wersji bazy danych jest dość trywialnym ćwiczeniem, ale nie mam dużej pewności, że jest ona spójna we wszystkich bazach danych, i nie jestem jedyną osobą, która musi dbać o mój kod (więc inne osoby również będą musiały zdawać sobie sprawę z tego, z czym jest to równoważne).
Oczywista różnica w porównaniu z WHERE vs ON polega na tym, że połączenie jest zewnętrzne:
Zakładając T1 z pojedynczym polem ID, jednym wierszem zawierającym wartość 1 oraz T2 z polem ID i WARTOŚĆ (jeden wiersz, ID=1, WARTOŚĆ=6), otrzymujemy:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
nie daje wierszy, ponieważ GDZIE jest wymagane do dopasowania, podczas gdy
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
da jeden wiersz z wartościami
1, NULL, NULL
ponieważ ON jest wymagane tylko do dopasowania sprzężenia, co jest opcjonalne ze względu na to, że jest zewnętrzne.