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

4114

Также как LEFT JOIN, RIGHT JOIN и FULL JOIN вписываются?

  • 48
    Из приведенных ниже ответов, комментариев и ссылок на них только один на самом деле объясняет, как диаграммы Венна представляют операторы: область пересечения окружности представляет собой набор строк в A JOIN B. Область, уникальная для каждого круга, представляет собой набор строк, которые вы получаете, взяв его Строки таблицы, которые не участвуют в A JOIN B и добавляют столбцы, уникальные для другой таблицы, все имеют значение NULL. (А большинство дают смутное поддельное соответствие кругов А и В.)
  • 1
    Многие ответы уже предоставлены, но я не видел этот учебник упомянутым. Если вы знаете диаграммы Венна, это БОЛЬШОЙ учебник: blog.codinghorror.com/a-visual-explanation-of-sql-joins Для меня это достаточно лаконично, чтобы быстро прочитать, но все же охватывает всю концепцию и работает все дела очень хорошо. Если вы не знаете, что такое диаграммы Венна, изучите их. Займет 5-10 минут, чтобы помочь вам, когда вам нужно будет визуализировать работу с наборами и управление операциями над наборами.
Показать ещё 6 комментариев
Теги:
database
join
outer-join
inner-join

33 ответа

5799
Лучший ответ

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

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

  • Внешнее объединение A и B дает результаты объединения A 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

Левое внешнее соединение

Левое внешнее соединение даст все строки в плюс любые общие строки в 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, т.е. все строки в и все строки в B. Если что-то в не имеет соответствующей базы данных в 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
  • 32
    Было бы хорошо дополнить пример, добавив еще одну строку в таблицу B со значением 4. Это покажет, что внутренние объединения не обязательно должны быть равными ни одному из рядов.
  • 442
    Прекрасное объяснение, однако, это утверждение: внешнее объединение A и B дает результаты объединения B, то есть внешние части объединения диаграммы Венна. не сформулировано точно. Внешнее соединение даст результаты пересечения B с B в дополнение к одному из следующих: все A (левое соединение), все B (правое соединение) или все A и все B (полное соединение). Только этот последний сценарий действительно является союзом Б. Тем не менее, хорошо написанное объяснение.
Показать ещё 20 комментариев
2482

Также вы можете рассмотреть следующую схему для разных типов соединений:

Изображение 3970

Источник: Visual-Representation-of-SQL-Joins подробно объясняется C.L. Моффат

  • 70
    Примечание: в MySQL нет FULL OUTER JOIN. stackoverflow.com/questions/12473210/...
  • 9
    Я думаю, что эта диаграмма предполагает, что нет повторяющегося Key , то есть Key уникален. Если бы Key не был уникальным, я думаю, что результатом был бы крест, и счетчик возвращений был бы намного больше, чем размер A.
Показать ещё 6 комментариев
564

Я рекомендую статью блога Джеффа. Лучшее описание, которое я когда-либо видел, плюс визуализация, например:

Внутренняя регистрация:

Изображение 3971

Полный Outer Join:

Изображение 3972

  • 39
    Эта диаграмма немного вводит в заблуждение концепцию. Читайте комментарии в посте.
  • 1
    @ ya23: что вы подразумеваете под полным внешним объединением?
Показать ещё 3 комментария
518

Диаграммы Венна на самом деле не делают этого для меня.

Например, они не показывают какого-либо различия между перекрестным соединением и внутренним соединением или, как правило, показывают какое-либо различие между различными типами предикатов соединения или обеспечивают основу для рассуждений о том, как они будут работать.

Нет никакой альтернативы пониманию логической обработки, и это довольно просто понять.

  1. Представьте себе крест.
  2. Оцените предложение on по всем строкам с шага 1, сохраняя те, где предикат оценивает значение true
  3. (Только для внешних соединений) добавьте обратно в любые внешние строки, которые были потеряны на шаге 2.

(NB: На практике оптимизатор запросов может найти более эффективные способы выполнения запроса, чем чисто логическое описание выше, но конечный результат должен быть одинаковым)

Я начну с анимированной версии полного внешнего соединения. Дальнейшее объяснение следует.

Изображение 3973


объяснение

Исходные таблицы

Изображение 3974

Сначала начните с CROSS JOIN (Carteian Product). Это не имеет предложения ON и просто возвращает каждую комбинацию строк из двух таблиц.

SELECT A.Colour, B.Colour FROM A CROSS JOIN B

Изображение 3975

Внутренние и внешние соединения имеют предикат предложения ON.

  • Внутреннее соединение. Оцените условие в предложении "ON" для всех строк в результате перекрестного соединения. Если true, верните объединенную строку. В противном случае отбросьте его.
  • Left Outer Join. То же, что и внутреннее соединение, то для любых строк в левой таблице, которые не соответствуют чему-либо, выводят их с NULL-значениями для столбцов правой таблицы.
  • Правое внешнее соединение. То же, что и внутреннее соединение, то для любых строк в правой таблице, которые не соответствуют чему-либо, выводят их с значениями NULL для столбцов левой таблицы.
  • Полное внешнее соединение. То же, что и внутреннее соединение, тогда сохраняйте левые несопоставимые строки, как в левом внешнем соединении, так и в правых не совпадающих строках в соответствии с правым внешним соединением.

Некоторые примеры

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour = B.Colour

Вышеприведенное классическое объединение equi.

Изображение 3976

Анимированная версия

Изображение 3977

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN ("Зеленый", "Синий")

Внутреннее условие соединения необязательно должно быть условием равенства, и ему не нужно ссылаться на столбцы из (или даже любой) таблиц. Оценка A.Colour NOT IN ('Green','Blue') в каждой строке перекрестного соединения возвращается.

Изображение 3978

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON 1 = 1

Условие соединения оценивается как true для всех строк в результате перекрестного соединения, так что это то же самое, что и кросс-соединение. Я не буду повторять изображение 16 строк.

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour

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

Изображение 3979

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

Это просто ограничивает предыдущий результат только возвратом строк, где B.Colour IS NULL. В этом конкретном случае это будут строки, которые были сохранены, поскольку они не совпадали в правой таблице, и запрос возвращает единственную красную строку, не сопоставленную в таблице B Это известно как анти-соединение.

Важно выбрать столбец для теста IS NULL который либо не имеет значения NULL, либо для которого условие соединения гарантирует, что любые значения NULL будут исключены для правильной работы этого шаблона и избежания просто возврата строк, которые имеют Значение NULL для этого столбца в дополнение к несогласованным строкам.

Изображение 3980

SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour

Правые внешние соединения действуют аналогично левым внешним соединениям, за исключением того, что они сохраняют несоответствующие строки из правой таблицы, а null расширяют левые столбцы.

Изображение 3981

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour

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

Изображение 3982

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0

Никакие строки в перекрестном соединении не соответствуют предикату 1=0. Все строки с обеих сторон сохраняются с использованием обычных правил внешнего соединения с NULL в столбцах из таблицы с другой стороны.

Изображение 3983

SELECT COALESCE (A.Colour, B.Colour) AS Color ОТ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ON 1 = 0

При незначительной поправке к предыдущему запросу можно смоделировать UNION ALL из двух таблиц.

Изображение 3984

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'

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

Изображение 3979

... И затем выполняется предложение "Где". NULL= 'Green' не оценивает значение true, поэтому строка, сохраненная внешним соединением, заканчивается отбрасыванием (вместе с синим), эффективно преобразуя соединение обратно во внутреннее.

Изображение 3985

Если бы намерение состояло в том, чтобы включать только строки из B, где Цвет Зеленый, а все строки из A, независимо от правильного синтаксиса,

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour AND B.Colour = 'Green'

Изображение 3986

SQL Fiddle

См. Эти примеры в реальном времени на SQLFiddle.com.

  • 39
    Я скажу, что хотя это не работает для меня так же хорошо, как диаграммы Венна, я ценю, что люди меняются и учатся по-разному, и это очень хорошо представленное объяснение, в отличие от всех, что я видел раньше, поэтому я поддерживаю @ypercube в начисление бонусных баллов. Также хорошая работа, объясняющая разницу в размещении дополнительных условий в предложении JOIN по сравнению с предложением WHERE. Слава тебе, Мартин Смит.
  • 20
    @OldPro Диаграммы Венна в порядке, я думаю, но они ничего не говорят о том, как представлять перекрестное соединение или дифференцировать один тип предиката соединения, например, равное соединение, от другого. Ментальная модель оценки предиката соединения в каждой строке результата перекрестного соединения затем добавляется обратно в несопоставленные строки, если внешнее соединение, и, наконец, оценивает, где лучше работает.
Показать ещё 12 комментариев
281

Из статьи "MySQL - ЛЕВЫЙ ПРИСОЕДИНЕНИЕ И ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, ВНУТРЕННЯЯ ВСТРЕЧА И ВЗАИМОДЕЙСТВИЕ" Грэм Эллис в своем блоге Horse Mouth.

p >

В базе данных, такой как MySQL, данные делятся на несколько таблиц, которые затем соединяются (Joined) вместе с помощью JOIN в SELECT для чтения записей из нескольких таблиц. Прочтите этот пример, чтобы узнать, как он работает.

Во-первых, некоторые примеры данных:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

REGULAR JOIN

Если мы выполняем регулярный JOIN (без каких-либо ключевых слов INNER, OUTER, LEFT или RIGHT), мы получаем все записи, соответствующие соответствующим образом в двух таблицах, и записи в обеих входящих таблицах, которые не совпадают не сообщается:

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

LEFT JOIN

Если мы делаем LEFT JOIN, мы получаем все записи, которые совпадают так же, и IN ADDITION мы получаем дополнительную запись для каждой несопоставимой записи в левой таблице соединения - таким образом, гарантируя (в этом примере), что каждый PERSON получает упоминание:

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

ПРАВОЕ СОЕДИНЕНИЕ

Если мы делаем ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, мы получаем все записи, которые соответствуют и IN ADDITION, дополнительную запись для каждой несогласованной записи в правой таблице соединения - в моем примере, это означает, что каждое свойство получает упоминание, даже если мы не имеют деталей продавца:

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

INNER JOIN выполняет полное соединение, как и в первом примере, и слово OUTER может быть добавлено после слова LEFT или RIGHT в последних двух примерах - оно обеспечивает совместимость с ODBC и не добавляет дополнительных возможностей.

122

Соединения используются для объединения данных из двух таблиц, в результате чего создается новая временная таблица. Соединения выполняются на основе чего-то, называемого предикатом, который определяет условие для использования для соединения. Разница между внутренним соединением и внешним соединением заключается в том, что внутреннее соединение будет возвращать только строки, которые фактически соответствуют на основе предиката соединения. Рассмотрим таблицу Employee and Location:

Изображение 3987

Внутреннее соединение: - Внутреннее соединение создает новую таблицу результатов путем объединения значений столбцов двух таблиц (Employee and Location) на основе предиката соединения. Запрос сравнивает каждую строку Employee с каждой строкой местоположения, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Когда предикат соединения выполняется путем сопоставления значений, отличных от NULL, значения столбцов для каждой согласованной пары строк Employee и Location объединяются в строку результатов. Вот как выглядит SQL для внутреннего соединения:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Теперь вот что получило результат работы SQL: Изображение 3988Изображение 3989

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

Left Outer Join: - Результат левого внешнего соединения (или просто левого соединения) для таблиц Employee and Location всегда содержит все записи "левой" таблицы (Employee), даже если условие соединения не находит подходящей записи в "правая" таблица (местоположение). Вот как выглядит SQL для левого внешнего соединения, используя приведенные выше таблицы:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Теперь вот, что результат запуска этого SQL будет выглядеть так: Изображение 3990Изображение 3991

Right Outer Join: - Правое внешнее соединение (или правое соединение) близко напоминает левое внешнее соединение, за исключением обработки обращенных столов. Каждая строка из "правой" таблицы (Location) появится хотя бы один раз в объединенной таблице. Если ни одна соответствующая строка из "левой" таблицы (Employee) не существует, NULL будет отображаться в столбцах Employee для тех записей, которые не совпадают в Location. Это выглядит так:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

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

Изображение 3992Изображение 3993

Полное Внешнее Объединение: - Полное Внешнее Присоединение или Полное Присоединение - сохранить информацию о немаркировке, включив нечетные строки в результаты соединения, используйте полное внешнее соединение. Он включает все строки из обеих таблиц, независимо от того, имеет ли другая таблица соответствующее значение. Изображение 3994

Источник изображения

Справочное руководство по MySQL 8.0 - Синтаксис соединения

Операции Oracle Join

120

Внутреннее соединение

Получить только сопоставленные строки, то есть A intersect B.

Изображение 3995

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Левое внешнее соединение

Выберите все записи из первой таблицы и любые записи во второй таблицу, соответствующую совпадающим клавишам.

Изображение 3996

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Полное внешнее соединение

Выберите все записи из второй таблицы и любые записи в первой таблицу, соответствующую совпадающим клавишам.

Изображение 3997

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Ссылки

  • 13
    Как называется инструмент? Я нахожу это интересным, так как показывает количество строк и диаграмм Венна.
  • 7
    @GrijeshChauhan Datamartist :)
Показать ещё 4 комментария
106

Простыми словами:

внутреннее соединение извлекает только согласованные строки.

В то время как внешнее соединение извлекает согласованные строки из одной таблицы и всех строк в другой таблице... результат зависит от того, какой из них вы используете:

  • Слева: совпадающие строки в правой таблице и все строки в левой таблице

  • Правильно. Соответствующие строки в левой таблице и все строки в правой таблице или

  • Полный: все строки во всех таблицах. Не имеет значения, есть ли совпадение или нет.

  • 0
    @nomen Не то, чтобы этот ответ обращался к нему, но INNER JOIN - это пересечение, а FULL OUTER JOIN - это соответствующее UNION, если левый и правый наборы / окружности содержат строки (соответственно) соединения LEFT и RIGHT. PS Этот ответ неясен для строк во входных и выходных данных. Он путает «в левой / правой таблице» с «имеет левую / правую часть в левой / правой» и использует «совпадающую строку» против «все» для обозначения строки, расширенной строкой из другой таблицы, против нуля.
97

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

A (слева) внешнее соединение показывает строки для каждой записи в левой части, даже если на другой (правой) стороне соединения нет соответствующих строк. Если нет соответствующей строки, столбцы для другой (правой) стороны отображают NULL.

71

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

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

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

заказы

  • Номер заказа
  • Имя покупателя

Информация для заказа

  • OrderDetailID
  • Номер заказа
  • Наименование товара
  • Кол-во
  • Цена

Запрос

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

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

Если вы измените его на ВНЕШНЮЮ ВЛЕВО

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

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

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

  • 1
    Я ценю простой, но реалистичный пример. Я изменил запрос, например, SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC для SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC (MySQL) с успехом. Я не был уверен насчет дополнительных условий, они хорошо сочетаются ...
58

Простыми словами:

Внутреннее соединение → Принимать ТОЛЬКО общие записи из родительских и дочерних таблиц. ГДЕ первичный ключ родительской таблицы соответствует внешнему ключу в таблице "Дети".

Левое соединение

псевдокод

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Правильное соединение: прямо противоположно левому соединению. Поместите имя таблицы в LEFT JOIN с правой стороны в правое соединение, вы получите тот же результат, что и LEFT JOIN.

Внешнее соединение. Показать все записи в обеих таблицах No matter what. Если записи в левой таблице не соответствуют таблице справа на основе основного, Forieign ключа, используйте значение NULL в результате объединения.

Пример:

Изображение 3998

Предположим теперь, что для 2 таблиц

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Здесь таблица сотрудников - это мастер-таблица, phone_numbers_employees - дочерняя таблица (она содержит emp_id как внешний ключ, который соединяет employee.id с его дочерней таблицей.)

Внутренние соединения

Возьмите записи из 2 таблиц ТОЛЬКО ЕСЛИ Первичный ключ таблицы employee (его идентификатор) соответствует внешнему ключу таблицы "Дети" phone_numbers_employees (emp_id).

Таким образом, запрос будет выглядеть следующим образом:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Здесь берут только соответствующие строки для первичного ключа = внешний ключ, как объяснялось выше. Если не совпадают строки в первичном ключе = внешний ключ, пропускаются как результат объединения.

Левые соединения:

Левое соединение сохраняет все строки левой таблицы, независимо от того, есть ли строка, которая соответствует правой таблице.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Внешние соединения:

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Диаграмматически это выглядит так:

Изображение 3999

  • 1
    Результат не имеет ничего общего с первичными / уникальными / потенциальными ключами и внешними ключами. Бавур может и должен быть описан без ссылки на них. Рассчитывается перекрестное соединение, затем отфильтровываются строки, не соответствующие условию ON; дополнительно для внешних объединений строки, отфильтрованные / несопоставленные, расширяются на NULL (согласно LEFT / RIGHT / FULL и включаются).
50

Изображение 4000

Это хорошее диаграммное объяснение для всех типов объединений

источник: http://ssiddique.info/understanding-sql-joins-in-easy-way.html

50

Вы используете INNER JOIN, чтобы возвращать все строки из обеих таблиц, где есть совпадение. т.е. в итоговой таблице все строки и столбцы будут иметь значения.

В OUTER JOIN итоговая таблица может содержать пустые столбцы. Внешнее соединение может быть либо LEFT, либо RIGHT.

LEFT OUTER JOIN возвращает все строки из первой таблицы, даже если во второй таблице нет совпадений.

RIGHT OUTER JOIN возвращает все строки из второй таблицы, даже если совпадений нет в первой таблице.

48

INNER JOIN требуется, по крайней мере, совпадение при сравнении двух таблиц. Например, таблица A и таблица B, которая подразумевает A 8 B (пересечение A).

LEFT OUTER JOIN и LEFT JOIN совпадают. Он дает все соответствия записей в обеих таблицах и всех возможностях левой таблицы.

Аналогично, RIGHT OUTER JOIN и RIGHT JOIN совпадают. Он дает все соответствия записей в обеих таблицах и всех возможностях правой таблицы.

FULL JOIN представляет собой комбинацию LEFT OUTER JOIN и RIGHT OUTER JOIN без дублирования.

38

Ответ заключается в значении каждого из них, поэтому в результатах.

Примечание:
В SQLite нет RIGHT OUTER JOIN или FULL OUTER JOIN.
А также в MySQL нет FULL OUTER JOIN.

Мой ответ основан на выше Примечание.

Если у вас есть две таблицы:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

КРОСС-ПРИСОЕДИНЕНИЕ/ВСТУПЛЕНИЕ:
Вы можете иметь все эти данные таблиц с помощью CROSS JOIN или просто с помощью , следующим образом:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

INNER JOIN:
Если вы хотите добавить фильтр к приведенным выше результатам на основе отношения типа table1.id = table2.id, вы можете использовать INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

LEFT [OUTER] JOIN:
Если вы хотите иметь все строки одной из таблиц в приведенном выше результате - с одним и тем же отношением - вы можете использовать LEFT JOIN:
(Для RIGHT JOIN просто измените место таблиц)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ:
Когда вы также хотите иметь все строки другой таблицы в своих результатах, вы можете использовать FULL OUTER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

Ну, по мере необходимости, вы выбираете каждый, который покрывает ваши потребности;).

  • 0
    Вы можете добавить к заметке, что в MySQL также нет full outer join .
33

В SQL A join используется для сравнения и объединения - буквально join - и возвращает определенные строки данных из двух или более таблиц в базе данных. внутреннее соединение находит и возвращает соответствующие данные из таблиц, а внешнее соединение находит и возвращает соответствующие данные и некоторые несходные данные из таблиц.

Внутренняя регистрация

внутреннее соединение фокусируется на общности между двумя таблицами. При использовании внутреннего соединения должны быть, по крайней мере, некоторые совпадающие данные между двумя (или более) таблицами, которые сравниваются. внутреннее соединение ищет таблицы для сопоставления или перекрытия данных. При обнаружении этого, внутреннее соединение объединяет и возвращает информацию в одну новую таблицу.

Пример внутреннего подключения

Рассмотрим общий сценарий двух таблиц: цены и количества продуктов. Общая информация в двух таблицах - это имя продукта, так что это логический столбец присоединиться к таблицам. Есть несколько продуктов, которые являются общими в двух таблицах; другие уникальны для одной из таблиц и не имеют соответствия в другой таблице.

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

Изображение 4001

Внешняя связь

An external join возвращает набор записей (или строк), которые включают в себя возвращение внутреннего соединения, а также другие строки, для которых не найдено соответствующего соответствия другую таблицу.

Существует три типа внешних соединений:

  • Left Outer Join (или Left Join)
  • Right Outer Join (или Right Join)
  • Полное внешнее соединение (или полное соединение) Каждое из этих внешних соединений относится к части данных, которые сравниваются, объединяются и возвращаются. Иногда в этом процессе создаются нули, поскольку некоторые данные совместно используются, а другие данные не являются.

Левое внешнее соединение

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

Пример левого соединения

В моей базе данных примеров есть два продукта - апельсины и помидоры - в левой части (таблица цен), которые не имеют соответствующей записи в правой колонке (таблица количества). В левом соединении эти строки включаются в набор результатов с NULL в столбце Количество. Остальные строки в результате совпадают с внутренним соединением .

Изображение 4002

Right Outer Join

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

Пример правого соединения

Как и в примере left join, вывод правого внешнего соединения включает в себя все строки внутреннего соединения и двух строк - брокколи и squash - из "правой" (таблица количества), которые не имеют соответствующих записей слева.

Изображение 4003

Полная внешняя подписка

A полное внешнее соединение или полное соединение, которое не поддерживается популярной системой управления базами данных MySQL, объединяет и возвращает все данные из двух или более таблиц независимо от того, существует ли общая информация. Подумайте о full join как о простом дублировании всей указанной информации, но в одной таблице, а не в нескольких таблицах. Если отсутствуют совпадающие данные, будут выданы нули.

Изображение 4004

29

Разница заключается в том, как таблицы объединяются, если нет общих записей.

  • JOIN совпадает с INNER JOIN и означает только просмотр записей, общих для обеих таблиц. Независимо от того, являются ли записи обычными, определяются поля в предложении join. Например:

    FROM t1
    JOIN t2 on t1.ID = t2.ID
    

    означает показывать только записи, где в обеих таблицах существует одно и то же значение ID.

  • LEFT JOIN совпадает с LEFT OUTER JOIN и означает, что все записи из левой таблицы (т.е. те, которые предшествуют в инструкции SQL), независимо от наличия совпадающих записей в правой таблице.

  • RIGHT JOIN совпадает с RIGHT OUTER JOIN и означает противоположность LEFT JOIN, то есть отображает все записи из второй (правой) таблицы и только совпадения записей из первой (левой) таблицы.

Источник: В чем разница между LEFT, RIGHT, INNER, OUTER, JOIN?

27

Внутреннее соединение.

Соединение объединяет строки из двух таблиц. Внутреннее соединение пытается сопоставить две таблицы на основе критериев, заданных в запросе, и возвращает только строки, которые соответствуют. Если строка из первой таблицы в соединении совпадает с двумя строками во второй таблице, в результатах будут возвращены две строки. Если theres строка в первой таблице, которая не соответствует строке во второй, ее не возвращают; Аналогично, если theres строка во второй таблице, которая не соответствует строке в первом, ее не возвращают.

Внешняя связь.

В результате попыток левого соединения найти совпадение строк из первой таблицы со строками во второй таблице. Если он не сможет найти совпадение, он вернет столбцы из первой таблицы и оставит столбцы со второй таблицы пустым (null).

23

В других ответах я не вижу подробностей о производительности и оптимизаторе.

Иногда полезно знать, что только INNER JOIN является ассоциативным, что означает, что оптимизатор имеет наибольшую возможность играть с ним. Он может изменить порядок заказа на соединение, чтобы сделать его более быстрым, сохраняя тот же результат. Оптимизатор может использовать большинство режимов соединения.

Как правило, рекомендуется использовать INNER JOIN вместо разных типов соединений. (Конечно, если это возможно, учитывая ожидаемый набор результатов.)

В этом странном ассоциативном поведении есть несколько хороших примеров и объяснений:

  • 3
    Не может быть "хорошей практикой" использовать один тип соединения поверх другого. То, какое соединение вы используете, определяет данные, которые вы хотите. Если вы используете другой, вы не правы. Плюс, в Oracle, по крайней мере, этот ответ совершенно неверен. Это звучит совершенно неправильно для всех, и у вас нет никаких доказательств. У тебя есть доказательства?
  • 0
    1. Я имею в виду, попробуйте использовать. Я видел много людей, использующих LEFT OUTER соединения везде без какой-либо веской причины. (Объединенные столбцы были «не нулевыми».) В этих случаях было бы определенно лучше использовать INNER объединения. 2. Я добавил ссылку, объясняющую неассоциативное поведение лучше, чем я мог.
Показать ещё 2 комментария
22

Разница заключается в том, как таблицы объединяются, если нет общих записей.

JOIN совпадает с INNER JOIN и означает только просмотр записей, общих для обеих таблиц. Независимо от того, являются ли записи обычными, определяются поля в предложении join.

Например:

SELECT * 
FROM t1
JOIN t2 on t1.ID = t2.ID

Это означает показывать только записи, где в обеих таблицах существует одно и то же значение ID.

LEFT JOIN совпадает с LEFT OUTER JOIN и означает показывать все записи из левой таблицы (то есть той, которая предшествует в инструкции SQL), независимо от наличия совпадающих записей в правой таблице.

RIGHT JOIN совпадает с RIGHT OUTER JOIN и означает противоположность LEFT JOIN, то есть отображает все записи из второй (правой) таблицы и только соответствующие записи из первой (левой) таблицы.

18

Критикуя очень любимую красноватую диаграмму Венна, я подумал, что это справедливо, чтобы опубликовать мою собственную попытку.

Несмотря на то, что ответ @Martin Smith - лучший из этой группы, он показывает только столбец ключей из каждой таблицы, тогда как я думаю, что в идеале должны быть показаны нек-ликовые столбцы.

Лучшее, что я мог сделать за полчаса, я все же не думаю, что он адекватно показывает, что нули есть из-за отсутствия ключевых значений в TableB или что OUTER JOIN на самом деле является объединением, а не присоединиться:

Изображение 4005

  • 2
    Вопрос в том, чтобы спросить разницу между ВНУТРЕННИМИ и ВНЕШНИМИ объединениями, хотя не обязательно оставлять внешнее соединение
16

Точный алгоритм для INNER JOIN, LEFT/RIGHT OUTER JOIN:

  1. Возьмите каждую строку из первой таблицы: a
  2. Рассмотрим все строки из второй таблицы: (a, b[i])
  3. Оцените предложение ON... каждой пары: ON( a, b[i] ) = true/false?
    • Когда условие оценивается как true, верните эту объединенную строку (a, b[i]).
    • При достижении конца второй таблицы без какого-либо совпадения, а это Outer Join верните (виртуальную) пару с помощью Null для всех столбцов другой таблицы: (a, Null) для LEFT внешнего соединения или (Null, b) для RIGHT external присоединиться. Это делается для обеспечения того, чтобы все строки первой таблицы существовали в конечных результатах.

Примечание: условие, указанное в предложении ON, может быть любым, не требуется использовать первичные ключи (и вам не нужно всегда ссылаться на столбцы из обеих таблиц)! Например:

Изображение 4006


Изображение 4007

Примечание: Left Join = Left Outer Join, Right Join = Right Outer Join.

15

Простейшие определения

Inner Join: возвращает сопоставленные записи из обеих таблиц.

Full Outer Join: возвращает сопоставленные и несвязанные записи из обеих таблиц с нулевым значением для несравнимых записей из Обе таблицы.

Left Outer Join: возвращает совпадающие и несогласованные записи только из таблицы Левая сторона.

Right Outer Join: возвращает совпадающие и несогласованные записи только из таблицы с правой стороны.

В-Short

Совпадение + Слева Непревзойденное + Правое Непревзойденное = Полное внешнее соединение

Совпадение + Левое Непревзойденное = Левое внешнее соединение

Совпадает + Прямо Непревзойденное = Прямое внешнее соединение

Согласовано = Внутреннее соединение

  • 1
    Это замечательно и объясняет, почему объединение не работает так, как ожидалось для индексов временных рядов. Отметки времени на расстоянии одной секунды не имеют себе равных.
  • 0
    @yeliabsalohcin Вы не объясняете «как ожидалось» здесь или «работает» в своем комментарии к вопросу. Это просто какое-то необъяснимое личное заблуждение, которое, как ни странно, ожидают другие. Если вы воспринимаете слова как небрежные, когда вы читаете - неправильно истолковываете ясное письмо и / или принимаете нечеткое письмо - как, когда вы пишете здесь, тогда вы можете ожидать ошибочных представлений. На самом деле этот ответ, как и большинство здесь, неясен и неправильный. «Внутреннее соединение: возвращает сопоставленные записи из обеих таблиц» неправильно, если наборы входных столбцов различаются. Он пытается что-то сказать, но это не так . (Смотри мой ответ.)
15

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

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

Существует три типа внешних соединений:

Левая внешняя связь (или левая регистрация) Правое внешнее соединение (или правое соединение) Полная внешняя регистрация (или полная регистрация) Каждое из этих внешних соединений относится к части данных, которые сравниваются, объединяются и возвращаются. Иногда в этом процессе создаются нули, поскольку некоторые данные совместно используются, а другие данные не являются.

12

Изображение 4008

  • INNER JOIN Наиболее типичное соединение для двух или более таблиц. Он возвращает совпадение данных как по таблице ON, так и по команде forignkey.
  • OUTER JOIN - это то же самое, что и INNER JOIN, но также включает данные NULL в ResultSet.
    • LEFT JOIN= INNER JOIN + Непревзойденные данные левого стола с нулевым совпадением на правой таблице.
    • RIGHT JOIN= INNER JOIN + Непревзойденные данные правой таблицы с нулевым совпадением на левой таблице.
    • FULL JOIN= INNER JOIN + Непревзойденные данные в правой и левой таблицах с нулевыми совпадениями.
  • Самосоединение не является ключевым словом в SQL, когда таблица ссылается на данные сама по себе, знает как самостоятельное объединение. Используя INNER JOIN и OUTER JOIN мы можем писать запросы на самостоятельное присоединение.

Например:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 
  • 0
    хорошо и проще для понимания.
12

INNER JOIN

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

ВЛЕВОЕ ВЗАИМОДЕЙСТВИЕ

Левое внешнее соединение или левое соединение приводит к набору, в котором сохраняются все строки из первой или левой стороны таблицы. Строки со второй или правой стороны таблицы отображаются только в том случае, если они совпадают с строками из первой таблицы. Если в левой таблице есть значения, но не справа, таблица будет считаться нулевой, что означает, что значение не было установлено.

ПРАВОЙ ВНЕШНИЙ ВХОД

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

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

Полное внешнее соединение или просто внешнее соединение создает набор результатов со всеми строками обеих таблиц, независимо от того, имеются ли какие-либо совпадения. Аналогично левому и правому объединению мы называем пустые пространства нулями.

Для более Ссылка

9

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

Они являются наиболее часто используемыми экзистенциальными операторами в SQL, где INNER JOIN используется для "существует", а LEFT OUTER JOIN используется для "не существует".

Рассмотрим эти запросы:

users who have posted and have votes
users who have posted but have no badges

Люди, которые ищут комплексные решения (отраслевой термин), распознают соответствующие запросы как:

users who have posted INTERSECT users who have votes
users who have posted MINUS users who have badges

Переведя их в стандартный SQL:

SELECT UserId FROM Posts
INTERSECT 
SELECT UserId FROM Votes;

SELECT UserId FROM Posts
EXCEPT 
SELECT UserId FROM Badges;

Другие будут думать так же:

users who have posted and IN the set of users who have votes
users who have posted and NOT IN the set of users who have badges

Переведя их в стандартный SQL:

SELECT UserId 
  FROM Posts
 WHERE UserId IN ( SELECT UserId FROM Votes );

SELECT UserId 
  FROM Posts
 WHERE UserId NOT IN ( SELECT UserId FROM Badges );

Некоторые будут думать в терминах "существования" внутри множеств, например

users who have posted and EXIST in the set of users who have votes
users who have posted and do NOT EXIST in the set of users who have badges

Переведя их в стандартный SQL (обратите внимание, что теперь нам нужно использовать переменные диапазона, т.е. p, v, b):

SELECT p.UserId 
  FROM Posts p
 WHERE EXISTS ( SELECT *
                  FROM Votes v
                 WHERE v.UserId = p.UserId );

SELECT p.UserId 
  FROM Posts p
 WHERE NOT EXISTS ( SELECT *
                      FROM Badges b
                     WHERE b.UserId = p.UserId );

Однако я обнаружил, что подход "отраслевой стандарт" заключается в том, чтобы использовать только объединения. Я не знаю, что думает здесь (Закон инструмента? Преждевременная оптимизация?), Поэтому я перейду к синтаксису:

SELECT p.UserId 
  FROM Posts p
       INNER JOIN Votes v ON v.UserId = p.UserId;

SELECT p.UserId 
  FROM Posts p
       LEFT JOIN Badges b ON b.UserId = p.UserId
 WHERE b.UserId IS NULL;

Что нужно отметить:

  • Единственный прогноз от Users но нам все же нужны все эти переменные диапазона (p, v, b) для условий поиска.
  • UserId IS NULL поиска пользователя UserId IS NULL "принадлежит" OUTER JOIN но отключено в запросе.
  • LEFT - это отраслевой стандарт: профессионалы переписывают запрос, чтобы избежать использования RIGHT !
  • Ключевое слово OUTER из LEFT OUTER JOIN опущено.

Заключительные замечания:

Иногда объединения используются в запросах исключительно для определения того, существуют ли значения или не существуют в другом наборе. Научитесь внимательно смотреть на проецируемые атрибуты (столбцы в предложении SELECT): если из объединенной таблицы их нет, они просто используются в качестве экзистенциальных операторов. Кроме того, для внешнего соединения найдите экземпляры <key_column> IS NULL в WHERE.

4

В простых условиях

1. INNER JOIN или EQUI JOIN: Возвращает набор результатов, который соответствует только условию в обеих таблицах.

2. ВНЕШНЯЯ СЕТЬ: Возвращает набор результатов всех значений из обеих таблиц, даже если есть условие соответствия или нет.

3. LEFT JOIN: Возвращает набор результатов всех значений из левой таблицы и только строки, соответствующие условию в правой таблице.

4. RIGHT JOIN: Возвращает набор результатов всех значений из правой таблицы и только строки, соответствующие условию в левой таблице.

5. ПОЛНОЕ СОЕДИНЕНИЕ: Полное соединение и полное внешнее соединение одинаковы.

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

  • Левое внешнее соединение - A left external join даст все строки в плюс любые общие строки в B.

  • Полное внешнее соединение. полное внешнее соединение даст вам объединение A и B, т.е. все строки в и все строки из B. Если что-то в не имеет соответствующей привязки в B, то часть B имеет значение NULL и наоборот.

  • 0
    Это и неправильно, и неясно. Соединение не является пересечением, если таблицы не имеют одинаковые столбцы. Внешние объединения не имеют строк из A или B, если они не имеют одинаковые столбцы, в этом случае не добавляются пустые значения. Вы пытаетесь что-то сказать, но вы этого не говорите. Вы не объясняете правильно или ясно.
  • 0
    @philipxy: не согласен с вашим утверждением. Join is not an intersection unless the tables have the same columns Вы можете объединять любые столбцы, которые вам нужны, и, если значение совпадает, они объединяются.
Показать ещё 1 комментарий
3

1. Внутренняя регистрация: Также называется Join. Он возвращает строки, присутствующие как в левой таблице, так и в правой таблице, только , если есть соответствие. В противном случае он возвращает нулевые записи.

Пример:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

Изображение 4012

2. Full Outer Join: Также называется Full Join. Он возвращает все строки, присутствующие как в левой таблице, так и в правой таблице.

Пример:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

Изображение 4013

3. Левое внешнее соединение: Или просто называется Left Join. Он возвращает все строки, присутствующие в левой таблице, и соответствующие строки из правой таблицы (если они есть).

4. Right Outer Join: Также называется Right Join. Он возвращает совпадающие строки из левой таблицы (если они есть) и всех строк, присутствующих в правой таблице.

Изображение 4014

Преимущества объединений

  • Выполняется быстрее.
  • 0
    Это верно только тогда, когда таблицы имеют одинаковый набор столбцов. (Это путает внутреннее соединение с пересечением и полное соединение с объединением.) Также «соответствие» не определено. Прочитайте мои другие комментарии.
3

Как внутренние, так и внешние соединения используются для объединения строк из двух или более таблиц в один результат. Это делается с использованием условия объединения. Условие соединения определяет, как столбцы из каждой таблицы сопоставляются друг с другом. В большинстве случаев цель состоит в том, чтобы найти равные значения между таблицами и включать эти соответствия.

Наиболее распространенным случаем является то, что вы сопоставляете внешний ключ одной таблицы с первичным ключом другого, например, при использовании и ID для поиска значения.

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

Внутренние соединения не включают несогласованные строки; тогда как внешние объединения включают их. Давайте немного углубимся в механику каждого

Механика внутренней связи

Внутреннее соединение используется для возврата результатов путем объединения строк из двух или более таблиц.

В своем простейшем случае, когда нет условия соединения, внутреннее объединение объединит все строки из одной таблицы с данными из другого. Если первая таблица содержала три строки, а вторая, четыре, то окончательный результат содержал бы двенадцать (3 x 4 = 12)!

Цель условия соединения - ограничить, какие строки объединяются. В большинстве случаев мы ограничиваем строки теми, которые соответствуют столбцу. Если у человека более одного номера телефона, производится более одного совпадения. Из этого вы можете видеть, что мы можем получить больше возвращенных строк, чем у каждого человека.

Изображение 4009

Таблицы для присоединения. Обратно, если у человека нет номера телефона, тогда в PersonPhone не будет записи, и никакого совпадения не будет. Этот конкретный человек не будет включен в результаты, так как включены только те, у кого есть спички. Попробуем пример. Предположим, что HR Manager хочет создать телефонный каталог. Им нужны имена людей, фамилия, название и номера телефонов. Какой запрос вы могли бы использовать для создания этого? Вот то, что могло бы сделать трюк:

SELECT   P.FirstName,
         P.LastName,
         P.Title,
         PH.PhoneNumber
FROM     Person.Person AS P
         INNER JOIN
         Person.PersonPhone AS PH
         ON P.BusinessEntityID = PH.BusinessEntityID
         AND PH.PhoneNumberTypeID = 3
ORDER BY P.LastName

INNER JOIN задает, какие таблицы для соединения и условия соответствия для этого. Условие PH.Phone NumberTyeID = 3 ограничивает запрос рабочими числами. Если вы выполните вышеуказанное, вы получите следующие результаты:

Изображение 4010

Внутренние результаты присоединения Помните, что внутреннее соединение возвращает строку, где условие соответствия истинно. В этом примере строки, в которых идентификаторы BusinessEntityID не совпадают, содержат arent. Это может быть проблемой, если у человека нет номера телефона, так как эти сотрудники не будут в списке. Если вы хотите включить этих сотрудников, вы можете использовать Outer join.

Механизм внешней механики

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

SELECT   P.FirstName,
         P.LastName,
         P.Title,
         PH.PhoneNumber
FROM     Person.Person AS P
         LEFT OUTER JOIN
         Person.PersonPhone AS PH
         ON P.BusinessEntityID = PH.BusinessEntityID
         AND PH.PhoneNumberTypeID = 3
ORDER BY P.LastName

Вы можете узнать больше о левом и правом внешних соединениях в этой статье, а теперь просто понимаете, что при использовании LEFT OUTER JOIN все строки таблицы в предложении FROM включаются в результат, даже если совпадение не является найденный с другой таблицей. Если совпадение не найдено, то в столбце помещается NULL. Вы можете увидеть это в действии ниже:

Изображение 4011 Outer Join Results Обратите внимание, что в примере PhoneNumber для Catherine Abel имеет значение NULL. Это связано с тем, что рабочий номер Catherines не указан, и во время соединения не было найдено совпадений. Если бы это было внутреннее соединение, то эта строка не была бы включена в результаты.

1

Разница между внутренним соединением и внешним соединением следующая:

  • Внутреннее объединение - это объединение, объединяющее таблицы на основе совпадающих кортежей, тогда как внешнее объединение - это объединение, которое объединяет таблицу на основе как согласованного, так и несогласованного кортежа.
  • Внутреннее объединение объединяет согласованную строку из двух таблиц, в которых пропущена непревзойденная строка, тогда как внешнее объединение объединяет строки из двух таблиц, а несогласованные строки заполняют нулевым значением.
  • Внутреннее соединение подобно операции пересечения, тогда как внешнее соединение подобно операции объединения.
  • Внутреннее объединение - это два типа, тогда как внешнее объединение - три типа.
  • Внутреннее соединение медленнее, тогда как внешнее соединение быстрее, чем внутреннее соединение.
0

left join on (aka left outer join on) возвращает inner join on union all строк union all непревзойденных строк левой строки, расширенных нулями.

right join (on aka right outer join on) возвращает inner join on строках union all несогласованные строки правой строки, расширенные нулями.

full join on (aka full outer join on) возвращает inner join on строках union all непревзойденные строки в левой строке, расширенные пулом NULL, union all непревзойденные строки правой таблицы, расширенные нулями.

(SQL Standard 2006 SQL/Foundation 7.7 Правила синтаксиса 1, Общие правила 1 b, 3 c & d, 5 b.)

Поэтому не используйте outer join пока не узнаете, что такое inner join.


Узнайте, какие inner join строки строк возвращаются.

Прочитайте мои комментарии там много запутанных и бедных ответов.

Затем прочитайте мои комментарии здесь, много разных и запутанных ответов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню