Разница между 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 OraclePersons.P_Id = Orders.P_Id(+)
синтаксис для левого внешнего соединения, для образец.