В чем разница между "INNER JOIN" и "OUTER JOIN"?
Какова роль операторов LEFT OUTER JOIN
, RIGHT OUTER JOIN
и FULL OUTER JOIN
в запросах SQL и как они соотносятся друг с другом?
5 ответ(ов)
В простых словах:
Внутреннее соединение (inner join) возвращает только те строки, которые совпадают в обеих таблицах.
В то время как внешнее соединение (outer join) возвращает совпадающие строки из одной таблицы и все строки из другой таблицы. Результат зависит от типа внешнего соединения:
- Левое соединение (left join): совпадающие строки из правой таблицы и все строки из левой таблицы.
- Правое соединение (right join): совпадающие строки из левой таблицы и все строки из правой таблицы.
- Полное соединение (full join): все строки из обеих таблиц, независимо от наличия совпадений.
INNER JOIN отображает только те строки, для которых есть соответствующие записи с правой стороны соединения.
LEFT OUTER JOIN, в свою очередь, показывает все строки из левой таблицы, даже если для них нет соответствующих строк с правой стороны. В случае отсутствия соответствующей строки, колонки с правой стороны будут отображать значения NULL.
Inner join требует, чтобы запись с связанным идентификатором существовала в присоединенной таблице.
В то время как outer join вернет записи с левой стороны, даже если для правой стороны ничего не существует.
Например, у вас есть таблицы Orders
и OrderDetails
, которые связаны по полю OrderID
.
Orders
- OrderID
- CustomerName
OrderDetails
- OrderDetailID
- OrderID
- ProductName
- Qty
- Price
Запрос
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
вернет только те заказы, которые также имеют соответствующие записи в таблице OrderDetails
.
Если вы измените его на OUTER LEFT JOIN
:
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
то вы получите записи из таблицы Orders
, даже если для них нет соответствующих записей в таблице OrderDetails
.
Это можно использовать для поиска заказов, у которых отсутствуют записи в OrderDetails
, что может указывать на возможный "сиротский" заказ, добавив условие в WHERE
, например: WHERE OrderDetails.OrderID IS NULL
.
INNER JOIN
требует, чтобы в сравнении двух таблиц была хотя бы одна совпадающая запись. Например, если у нас есть таблицы A и B, то это можно представить как A ∩ B (пересечение A и B).
LEFT OUTER JOIN
и LEFT JOIN
— это одно и то же. Этот тип соединения возвращает все записи, соответствующие в обеих таблицах, а также все записи из левой таблицы, даже если для них нет соответствий в правой.
Аналогично, RIGHT OUTER JOIN
и RIGHT JOIN
также являются эквивалентными. Они возвращают все записи, соответствующие в обеих таблицах, а также все записи из правой таблицы, даже если для них нет соответствий в левой.
FULL JOIN
представляет собой комбинацию LEFT OUTER JOIN
и RIGHT OUTER JOIN
без дублирования записей.
Вы используете INNER JOIN
, чтобы вернуть все строки из обеих таблиц, где есть совпадение. То есть в результирующей таблице все строки и столбцы будут содержать значения.
В OUTER JOIN
результирующая таблица может содержать пустые столбцы. Внешнее соединение может быть либо LEFT
, либо RIGHT
.
LEFT OUTER JOIN
возвращает все строки из первой таблицы, даже если вторая таблица не содержит совпадений.
RIGHT OUTER JOIN
возвращает все строки из второй таблицы, даже если первая таблица не содержит совпадений.
В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN?
В чем разница между JOIN и INNER JOIN?
INNER JOIN ON vs WHERE: что выбрать?
Обновление данных в одной таблице из другой на основе совпадения ID
Как удалить с использованием INNER JOIN в SQL Server?