В чем разница между «INNER JOIN» и «OUTER JOIN»?

Простыми словами статья Google объясняет это как размер = размер передачи и контент = фактический размер

Это моя формула, основанная на чтении различных статей по этой теме (и я чтобы увеличить его с вашими комментариями) Size = Compression (Content) + Заголовок ответа

См. изображение, используемое в этой статье

Объяснение Google

4449
задан Martin Smith 13 February 2019 в 08:10
поделиться

3 ответа

Принятие, к которому Вы присоединяетесь на столбцах без дубликатов, который является очень общим падежом:

  • внутреннее объединение A и B дает результат A, пересекают B, т.е. внутреннюю часть пересечение схемы Венна.

  • внешнее объединение A и B дает результаты объединения B, т.е. внешние части объединения схемы Венна.

Примеры

предположим у Вас есть две таблицы с отдельным столбцом каждый и данные следующим образом:

A    B
-    -
1    3
2    4
3    5
4    6

Примечание, которые (1,2) уникальны для A, (3,4), распространено, и (5,6) уникальны для B.

Внутреннее объединение

внутреннее объединение с помощью любого из эквивалентных запросов дает пересечение этих двух таблиц, т.е. этих двух строк, которые они имеют общего.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Левое внешнее объединение

А уехал, внешнее объединение даст все строки в A плюс любые общие строки в B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Правильное внешнее объединение

внешнее объединение права А даст все строки в B плюс любые общие строки в A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Полное внешнее объединение

А полное внешнее объединение даст Вам объединение A и B, т.е. всех строк в A и всех строк в B. Если что-то в A не имеет соответствующей данной величины в B, то часть B является пустой, и наоборот.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
5929
ответ дан Darryl Hein 13 February 2019 в 18:10
поделиться

Внутренние объединения требуют, чтобы запись со связанным идентификатором существовала в объединяемой таблице.

Внешние объединения возвратят записи для левой стороны, даже если ничто не будет существовать для правой стороны.

, Например, у Вас есть Заказы и таблица OrderDetails. Они связаны "OrderID".

Заказы

  • количество OrderID
  • CustomerName

OrderDetails

  • OrderDetailID
  • OrderID
  • ProductName
  • Price

запрос

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

только возвратит Заказы, которые также имеют что-то в таблице OrderDetails.

при изменении его на OUTER, ПОКИНУТУЮ СОЕДИНЕНИЕ

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

затем, это возвратит записи из таблицы Orders, даже если у них не будет записей OrderDetails.

можно использовать это для нахождения Заказов, которые не имеют никакого OrderDetails, указывающего на возможный осиротевший порядок путем добавления где пункт как WHERE OrderDetails.OrderID IS NULL.

76
ответ дан SergeyUr 13 February 2019 в 18:10
поделиться

Внутреннее объединение только показывает строки, если существует запись соответствия на другом (справа) сторона соединения.

А (слева) внешнее объединение показывает строки для каждой записи на левой стороне, даже при отсутствии строк соответствия на другом (справа) стороны соединения. Если бы нет никакой строки соответствия, столбцы для другого (справа) примыкают, показал бы, АННУЛИРУЕТ.

101
ответ дан 1800 INFORMATION 13 February 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: