Разница между SQL JOIN и запросом из двух таблиц

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

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 ответов


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

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

соединение явно в вашем первом примере, и предложение join содержит ограничение вместо дополнительного WHERE предложения.


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


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

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

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


разницу в синтаксис, а не на семантика.

явно JOIN синтаксис:

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