Прочитавши його, я зрозумів, що це не дублікат Explicit vs Implicit SQL Joins. Відповідь може бути схожою (або навіть такою ж), але запитання інше.
У чому різниця і що повинно бути в кожному з них?
Якщо я правильно розумію теорію, то оптимізатор запитів повинен вміти використовувати обидва взаємозамінно.
Це не одне і те ж саме.
Розглянемо ці запити:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345
і
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
Перший поверне замовлення та його рядки, якщо такі є, для замовлення з номером 12345
. Другий поверне всі замовлення, але тільки замовлення 12345
буде мати будь-які рядки, пов'язані з ним.
За допомогою ВНУТРІШНЬОГО ОБ'ЄДНАННЯ
ці пункти є ефективно еквівалентними. Однак, тільки тому, що вони функціонально однакові, в тому сенсі, що вони дають однакові результати, не означає, що ці два види речень мають однакове семантичне значення.
На INNER JOIN
вони взаємозамінні, і оптимізатор переставить їх на свій розсуд.
На OUTER JOIN
вони не обов'язково взаємозамінні, в залежності від того, від якого боку з'єднання вони залежать.
Я ставлю їх в будь-якому місці в залежності від читабельності.
У внутрішньому об'єднанні вони означають те саме. Однак ви отримаєте різні результати при зовнішньому об'єднанні, залежно від того, чи помістили ви умову об'єднання в речення WHERE чи ON. Погляньте на це пов'язане питання і цю відповідь (від мене).
Я вважаю, що найдоцільніше завжди ставити умову об'єднання в реченні ON (якщо тільки це не зовнішнє об'єднання, і ви дійсно хочете, щоб вона була в реченні where), оскільки це робить більш зрозумілим для всіх, хто читає ваш запит, на яких умовах відбувається об'єднання таблиць, а також допомагає запобігти тому, щоб речення WHERE не було довжиною в десятки рядків.