Я не использую синтаксис USING, так как
- большинство моих объединений ему не подходит (не совпадает с именем поля, которое сопоставляется, и / или несколько совпадений в объединении) и
- не сразу очевидно, к чему это приводит в случае с более чем двумя таблицами
т. Е. При условии 3 таблицы со столбцами 'id' и 'id_2',
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
1012 * стать *
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
или
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
или что-то еще?
Выяснить это для конкретной версии базы данных - довольно тривиальное упражнение, но у меня нет большой уверенности в том, что она одинакова во всех базах данных, и я не единственный, кто должен поддерживать мой код (поэтому другие люди также должны будут знать, что это эквивалентно).
Очевидное отличие от WHERE против ON в том, что соединение является внешним:
Если предположить, что T1 с одним полем ID, одна строка содержит значение 1, а T2 с полем ID и VALUE (одна строка, ID = 1, VALUE = 6), то получим:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
не дает строк, так как ГДЕ должно совпадать, тогда как
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
даст одну строку со значениями
1, NULL, NULL
, поскольку ON требуется только для сопоставления соединения, что является необязательным, поскольку является внешним.