В чем разница между левым, правым, внешним и внутренним соединениями? - PullRequest
533 голосов
/ 15 января 2009

Мне интересно, как дифференцировать все эти разные соединения ...

Ответы [ 9 ]

772 голосов
/ 15 января 2009

Простой пример : допустим, у вас есть таблица Students и таблица Lockers. В SQL первая таблица, указанная в объединении, Students, является таблицей LEFT , а вторая, Lockers, является таблицей RIGHT .

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

Для примера рассмотрим, что у вас есть 100 учеников , 70 из которых имеют шкафчики. Всего у вас есть 50 шкафчиков , в 40 из которых есть как минимум 1 студент, а в 10 шкафчиках нет студентов.

INNER JOIN эквивалентно " показать мне всех учеников со шкафчиками ".
Любые студенты без шкафчиков или любые шкафчики без студентов отсутствуют.
Возвращает 70 строк

LEFT OUTER JOIN будет " показать мне всех студентов с соответствующим шкафчиком, если у них есть один ".
Это может быть общий список студентов или может использоваться для идентификации студентов без шкафчика.
Возвращает 100 строк

RIGHT OUTER JOIN будет " показать мне все шкафчики и студентов, назначенных им, если есть какие-либо ".
Это может быть использовано для идентификации шкафчиков, у которых нет назначенных учеников, или шкафчиков, у которых слишком много учеников.
Возвращает 80 строк (список из 70 учеников в 40 шкафчиках плюс 10 шкафчиков без ученика)

FULL OUTER JOIN было бы глупо и, вероятно, не очень полезно.
Что-то вроде " показать мне всех студентов и все шкафчики, и сопоставить их, где вы можете "
Возвращает 110 строк (все 100 студентов, в том числе без шкафчиков. шкафчики без ученика)

CROSS JOIN также довольно глупо в этом сценарии.
Он не использует связанное поле lockernumber в таблице студентов, так что вы в итоге получаете большой гигантский список всех возможное сопряжение ученика с шкафчиком, существует ли оно на самом деле.
Возвращает 5000 строк (100 студентов х 50 шкафчиков). Может быть полезно (с фильтрацией) в качестве отправной точки для сопоставления новых учеников с пустыми шкафчиками.

138 голосов
/ 15 января 2009

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

  • INNER объединяет сравнение двух таблиц и возвращает результаты только при наличии совпадения. Записи из первой таблицы дублируются, когда они совпадают с несколькими результатами во второй таблице. Соединения INNER обычно уменьшают наборы результатов, но поскольку записи могут дублироваться, это не гарантируется.
  • CROSS объединяет сравнение двух таблиц и возвращает все возможные комбинации строк из обеих таблиц. Вы можете получить много результатов от такого рода объединений, которые могут даже не иметь смысла, поэтому используйте их с осторожностью.
  • OUTER объединяет сравнение двух таблиц и возвращает данные, когда сопоставление доступно или значения NULL в противном случае. Как и в случае INNER join, это будет дублировать строки в одной таблице, когда она будет соответствовать нескольким записям в другой таблице. Объединения OUTER, как правило, увеличивают наборы результатов, поскольку сами по себе не удаляют записи из набора. Вы также должны квалифицировать OUTER соединение, чтобы определить, когда и где добавлять значения NULL:
    • LEFT означает сохранение всех записей из 1-й таблицы независимо от того, что они есть, и вставка значений NULL, если 2-я таблица не совпадает.
    • RIGHT означает обратное: сохраните все записи из 2-й таблицы, независимо от того, что, и вставьте значения NULL, если 1-я таблица не совпадает.
    • FULL означает сохранение всех записей из обеих таблиц и вставку значения NULL в любую из таблиц, если совпадений нет.

Часто вы видите, что ключевое слово OUTER исключено из синтаксиса. Вместо этого это будет просто «LEFT JOIN», «RIGHT JOIN» или «FULL JOIN». Это сделано потому, что соединения INNER и CROSS не имеют никакого смысла в отношении LEFT, RIGHT или FULL, и поэтому сами по себе этого достаточно для однозначного указания соединения OUTER.

Вот пример того, когда вы можете использовать каждый тип:

  • INNER: Вы хотите вернуть все записи из таблицы «Счета-фактуры» вместе с соответствующими «линиями счетов-фактур». Это предполагает, что в каждом действительном счете-фактуре будет хотя бы одна строка.
  • OUTER: Вы хотите вернуть все записи "InvoiceLines" для определенного счета-фактуры вместе с соответствующими записями "InventoryItem". Это бизнес, который также продает услуги, так что не все InvoiceLines будут иметь IventoryItem.
  • CROSS: у вас есть таблица цифр с 10 строками, каждая из которых содержит значения от «0» до «9». Вы хотите создать таблицу диапазонов дат, к которой нужно присоединиться, чтобы в результате вы получили одну запись на каждый день в пределах диапазона. Соединяя эту таблицу CROSS с собой несколько раз, вы можете создать столько последовательных целых чисел, сколько вам нужно (если вы начинаете с 10 до 1 степени, каждое соединение добавляет 1 к показателю степени). Затем используйте функцию DATEADD (), чтобы добавить эти значения к базовой дате для диапазона.
47 голосов
/ 15 января 2009

Есть только 4 вида:

  1. Внутреннее соединение : самый распространенный тип. Выходная строка создается для каждой пары входных строк, соответствующих условиям соединения.
  2. Левое внешнее объединение : То же самое, что и внутреннее объединение, за исключением того, что если есть какая-либо строка, для которой в таблице справа не может быть найдено соответствующей строки, выводится строка, содержащая значения таблица слева, с NULL для каждого значения в таблице справа. Это означает, что каждая строка из таблицы слева появится хотя бы один раз в выходных данных.
  3. Правое внешнее соединение : То же самое, что и левое внешнее соединение, за исключением перестановки ролей таблиц.
  4. Полное внешнее объединение : комбинация левого и правого внешних объединений. Каждая строка из обеих таблиц появится в выходных данных хотя бы один раз.

"перекрестное соединение" или "декартово соединение" - это просто внутреннее соединение, для которого не заданы условия соединения, в результате чего выводятся все пары строк.

Спасибо RusselH за указание ПОЛНЫХ объединений, которые я пропустил.

16 голосов
/ 12 января 2018

Разница в SQL JOINS:

Очень просто запомнить:

INNER JOIN показывает только записи, общие для обеих таблиц.

OUTER JOIN все содержимое обеих таблиц объединено, либо они совпадают, либо нет.

LEFT JOIN совпадает с LEFT OUTER JOIN - (Выбрать записи из первой (самой левой) таблицы с соответствующими записями правой таблицы.)

RIGHT JOIN совпадает с RIGHT OUTER JOIN - (Выбрать записи из второй (самой правой) таблицы с соответствующими записями левой таблицы.)

enter image description here

9 голосов
/ 15 января 2009

Оформить Присоединиться (SQL) в Википедии

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

  • Full Outer - две таблицы возвращают все строки и возвращают нули, если левый или правый столбец отсутствуют

  • Перекрестные соединения - декартово соединение, которое может быть опасным, если его не использовать осторожно

4 голосов
/ 15 января 2009

LEFT JOIN и RIGHT JOIN являются типами OUTER JOIN с.

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

3 голосов
/ 15 февраля 2015

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

Наружное соединение : (влево / вправо) : Показать все результаты из таблицы влево / вправо со спаренной строкой ( s ), если существует или нет.

2 голосов
/ 28 июня 2017

Может помочь сделать его более заметным. Один пример:

Таблица 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Таблица 2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

Что я получу, когда сделаю:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3
1 голос
/ 02 ноября 2017

Сначала вы должны понять, что делает join? Мы соединяем несколько таблиц и получаем конкретный результат из объединенных таблиц. Самый простой способ сделать это - cross join .

Допустим, таблица A имеет два столбца A и B. И таблица B имеет три столбца C и D. Если мы применим кросс-соединение, это приведет к множеству бессмысленных строк. Затем мы должны сопоставить, используя первичный ключ, чтобы получить фактические данные.

Слева: он вернет все записи из левой таблицы и сопоставленные записи из правой таблицы.

Справа: он вернется к левому соединению. Он вернет все записи из правой таблицы и сопоставленные записи из левой таблицы.

Внутренний: Это как пересечение. Он будет возвращать только совпадающие записи из обеих таблиц.

Наружно: И это как союз. Он вернет все доступные записи из обеих таблиц.

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

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

спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...