В чем разница между Left, Right, Outer и Inner Joins?

Мне интересно, как отличить все эти разные объединения...

Ответы

Ответ 1

Простой пример. Предположим, что у вас есть таблица 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 шкафчиков без студентки)

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ было бы глупо и, вероятно, мало пользы.
Что-то вроде "покажите мне всех учеников и всех шкафчиков и сопоставьте их там, где вы можете"
Возвращает 110 строк (все 100 учеников, в том числе без шкафчиков, плюс 10 шкафчиков без студентки)

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

Ответ 2

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

visual explanation of joins

и здесь Visual-Representation-of-SQL-Joins подробно объясняется CL Моффат

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Благодаря RusselH для указания FULL-соединений, которые я пропустил.

Ответ 5

Отъезд Join (SQL) в Википедии

  • Внутреннее соединение. При двух таблицах внутреннее объединение возвращает все строки, которые существуют в обеих таблицах.
  • left/right (external) join - если две таблицы возвращают все строки, существующие в левой или правой таблице вашего соединения, а также строки с другой стороны будут возвращены, когда предложение join является совпадением или null будет возвращен для этих столбцов

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

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

Ответ 6

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

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

Ответ 7

Внутреннее соединение. Показывать только строки, когда есть данные из обеих таблиц.

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

Ответ 8

Разница SQL JOINS:

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

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

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

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

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

введите описание изображения здесь

Ответ 9

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

Таблица 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

Ответ 10

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

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

Влево: он вернет все записи из левой таблицы и сопоставленную запись из правой таблицы.

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

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

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

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

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

спасибо