В чем разница между 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-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: И это похоже на объединение. Он вернет всю доступную запись из обеих таблиц.
Иногда нам не нужны все данные, а также нам нужны только общие данные или записи. мы можем легко получить его с помощью этих методов соединения. Помните, что левое и правое соединение также являются внешними.
Вы можете получить все записи только с помощью перекрестного соединения. Но это может быть дорого, когда речь заходит о миллионах записей. Поэтому сделайте это простым, используя левое, правое, внутреннее или внешнее соединение.
спасибо