Разница между SQL JOIN и запросами из двух таблиц - PullRequest
12 голосов
/ 28 февраля 2012

В чем разница между запросом

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

и этим

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

Ответы [ 4 ]

14 голосов
/ 28 февраля 2012

Существует небольшая разница в синтаксисе, но оба запроса выполняют объединение полей P_Id соответствующих таблиц.

Во втором примере это неявное соединение, которое вы ограничиваете в своем предложении WHERE полями P_Id обеих таблиц.

Соединение является явным в вашем первом примере, и предложение объединения содержит ограничение вместо дополнительного WHERE пункт.

3 голосов
/ 28 февраля 2012

Эта публикация SO содержит хорошее объяснение различий в жалобах ANSI SQL и имеет сходство с заданным здесь вопросом.

Хотя (как уже было сказано) оба запроса будут давать один и тот же результат, я считаю, что всегда полезно явно указывать свои JOIN. Это гораздо легче понять, особенно когда в предложении WHERE есть оценки, не связанные с JOIN.

Явное указание вашего JOIN также предотвращает непреднамеренное обращение к декартовому продукту. Во втором запросе выше, если вы (по какой-либо причине) забыли включить предложение WHERE, ваш запрос будет выполнен без условий JOIN и вернет набор результатов для каждой строки в Persons, совпадающей с каждой строкой в ​​Orders ... возможно, это не то, что ты хочешь.

3 голосов
/ 28 февраля 2012

Они в основном эквивалентны.Как правило, ключевые слова JOIN позволяют вам более четко указывать направление (LEFT, RIGHT) и тип (INNER, OUTER, CROSS) вашего объединения.

1 голос
/ 28 февраля 2012

Разница заключается в синтаксисе , но не в семантике .

Явный JOIN синтаксис:

  • считается более читабельным и
  • позволяет вам чисто и стандартным образом указать, хотите ли вы INNER, LEFT/RIGHT OUTER или CROSS соединение. Это отличается от использования специфичного для СУБД синтаксиса, такого как, например, старый синтаксис Oracle Persons.P_Id = Orders.P_Id(+) для левого внешнего соединения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...