Кроме того LEFT JOIN
, как RIGHT JOIN
и FULL JOIN
вписаться?
sql
database
join
inner-join
outer-join
Крис де Врис
источник
источник
Ответы:
Предполагается, что вы объединяете столбцы без дубликатов, что является очень распространенным случаем:
Внутреннее соединение A и B дает результат пересечения A B, то есть внутреннюю часть пересечения диаграммы Венна .
Внешнее объединение A и B дает результаты объединения B, то есть внешние части объединения диаграммы Венна.
Примеры
Предположим, у вас есть две таблицы с одним столбцом и данными следующим образом:
Обратите внимание, что (1,2) являются уникальными для A, (3,4) являются общими, и (5,6) являются уникальными для B.
Внутреннее соединение
Внутреннее соединение, использующее любой из эквивалентных запросов, дает пересечение двух таблиц, то есть двух общих строк, которые они имеют.
Левое внешнее соединение
Левое внешнее соединение даст все строки в A плюс все общие строки в B.
Правое внешнее соединение
Правое внешнее соединение даст все строки в B плюс все общие строки в A.
Полное внешнее соединение
Полное внешнее объединение даст вам объединение A и B, то есть всех строк в A и всех строк в B. Если что-то в A не имеет соответствующих данных в B, то часть B пуста, и порок наоборот.
источник
Диаграммы Венна на самом деле не делают это для меня.
Например, они не показывают какого-либо различия между перекрестным соединением и внутренним соединением или, в более общем случае, показывают какое-либо различие между различными типами предикатов объединения или предоставляют основу для рассуждений о том, как они будут работать.
Ничто не заменит понимание логической обработки, и в любом случае это относительно просто понять.
on
предложение по всем строкам, начиная с шага 1, сохраняя те, в которых предикат оценивается какtrue
(Примечание: на практике оптимизатор запросов может найти более эффективные способы выполнения запроса, чем приведенное выше чисто логическое описание, но конечный результат должен быть таким же)
Я начну с анимированной версии полного внешнего соединения . Дальнейшее объяснение следует.
объяснение
Исходные таблицы
Сначала начните с
CROSS JOIN
(AKA декартово произведение). Это не имеетON
предложения и просто возвращает каждую комбинацию строк из двух таблиц.ВЫБЕРИТЕ А.ЦВЕТ, Б.ЦВЕТ ИЗ КРЕСТА СОЕДИНИТЕ B
Внутренние и внешние соединения имеют предикат предложения ON.
Некоторые примеры
ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour
Выше классическое равное соединение.
Анимированная версия
ВЫБЕРИТЕ A.Colour, B.Colour ОТ ВНУТРЕННЕГО СОЕДИНЕНИЯ B НА A.Colour NOT IN («Зеленый», «Синий»)
Условие внутреннего соединения не обязательно должно быть условием равенства и не должно ссылаться на столбцы обеих (или даже обеих) таблиц. Оценка
A.Colour NOT IN ('Green','Blue')
по каждому ряду результатов перекрестного соединения.ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B ON 1 = 1
Условие соединения оценивается как true для всех строк в результате перекрестного соединения, так что это то же самое, что и перекрестное соединение. Я не буду повторять картину из 16 рядов снова.
ВЫБРАТЬ A.Colour, B.Colour ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour
Внешние объединения логически оцениваются так же, как и внутренние соединения, за исключением того, что если строка из левой таблицы (для левого объединения) вообще не объединяется ни с одной строкой из правой таблицы, она сохраняется в результате со
NULL
значениями для правые колонны.ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour ГДЕ B.Colour is NULL
Это просто ограничивает предыдущий результат, возвращая только те строки, где
B.Colour IS NULL
. В этом конкретном случае это будут строки, которые были сохранены, так как они не совпадали в правой таблице, и запрос возвращает одну красную строку, не совпадающую в таблицеB
. Это известно как анти-полусоединение.Важно выбрать столбец для
IS NULL
теста, который не имеет значения NULL или для которого условие соединения гарантирует, что любыеNULL
значения будут исключены, чтобы этот шаблон работал правильно, и избегал просто возвращать строки, которые, как оказалось, имеютNULL
значение для этого столбец в дополнение к несогласованным строкам.ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ПРАВИЛЬНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour
Правые внешние объединения действуют аналогично левым внешним соединениям, за исключением того, что они сохраняют несоответствующие строки из правой таблицы и нулевые расширяют левые столбцы.
ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ПОЛНОГО НАРУЖНОГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour
Полные внешние объединения объединяют поведение левого и правого объединений и сохраняют несовпадающие строки из левой и правой таблиц.
ВЫБРАТЬ A.Colour, B.Colour ИЗ ПОЛНОГО НАРУЖНОГО СОЕДИНЕНИЯ B ON 1 = 0
Строки в перекрестном соединении не соответствуют
1=0
предикату. Все строки с обеих сторон сохраняются с использованием обычных правил внешнего соединения с NULL в столбцах таблицы на другой стороне.ВЫБЕРИТЕ COALESCE (A.Colour, B.Colour) AS Color ИЗ ПОЛНОГО НАРУЖНОГО СОЕДИНЕНИЯ B ON 1 = 0
С незначительной поправкой к предыдущему запросу можно смоделировать одну
UNION ALL
из двух таблиц.ВЫБЕРИТЕ A.Colour, B.Colour ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour ГДЕ B.Colour = 'Зеленый'
Обратите внимание, что
WHERE
предложение (если оно присутствует) логически выполняется после объединения. Одной из распространенных ошибок является выполнение левого внешнего соединения, а затем включение предложения WHERE с условием в правой таблице, которое заканчивается исключением несовпадающих строк. Вышеуказанное завершает выполнение внешнего соединения ...... А затем выполняется предложение "Где".
NULL= 'Green'
не оценивается как истина, поэтому строка, сохраненная внешним соединением, в конечном итоге отбрасывается (вместе с синим), эффективно преобразовывая соединение обратно во внутреннее.Если бы целью было включить только строки из B, где Color - зеленый, и все строки из A независимо от правильного синтаксиса были бы
ВЫБРАТЬ A.Colour, B.Colour ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Colour = B.Colour AND B.Colour = 'Green'
SQL Fiddle
Посмотрите эти примеры в прямом эфире на SQLFiddle.com .
источник
Объединения используются для объединения данных из двух таблиц, в результате чего получается новая временная таблица. Объединения выполняются на основе того, что называется предикатом, в котором указывается условие, используемое для выполнения объединения. Разница между внутренним соединением и внешним соединением заключается в том, что внутреннее объединение будет возвращать только те строки, которые действительно совпадают, основываясь на предикате соединения. Например, давайте рассмотрим таблицу Employee and Location:
Внутреннее объединение : - Внутреннее объединение создает новую таблицу результатов, комбинируя значения столбцов двух таблиц ( Employee и Location ) на основе предиката объединения. Запрос сравнивает каждую строку Employee с каждой строкой Location, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Когда предикат соединения удовлетворяется путем сопоставления значений, отличных от NULL, значения столбцов для каждой соответствующей пары строк Employee и Location объединяются в результирующую строку. Вот как будет выглядеть SQL для внутреннего объединения:
Теперь вот как будет выглядеть результат выполнения SQL:
Внешнее соединение: - Для внешнего соединения не требуется, чтобы каждая запись в двух соединенных таблицах имела соответствующую запись. Объединенная таблица сохраняет каждую запись, даже если другой соответствующей записи не существует. Внешние объединения подразделяются далее на левые внешние и правые внешние объединения, в зависимости от того, какие строки таблицы сохраняются (левые или правые).
Левое внешнее соединение: - результат левого внешнего соединения (или просто левого соединения) для таблиц Employee и Location всегда содержит все записи «левой» таблицы ( Employee ), даже если условие соединения не находит подходящую запись в «Правильный» стол ( Location ). Вот как будет выглядеть SQL для левого внешнего соединения, используя таблицы выше:
Теперь вот как будет выглядеть результат выполнения этого SQL:
Правое внешнее соединение : - Правое внешнее соединение (или правое соединение) очень похоже на левое внешнее соединение, за исключением обработки обращенных таблиц. Каждая строка из «правой» таблицы ( Location ) появится в объединенной таблице хотя бы один раз. Если соответствующая строка из «левой» таблицы ( Employee ) не существует, в столбцах Employee появится NULLдля тех записей, которые не совпадают в Location . Вот как выглядит SQL:
Используя таблицы выше, мы можем показать, как будет выглядеть результирующий набор правого внешнего соединения:
Полные внешние соединения: - внешнее объединение: - Полное внешнее объединение или полное объединение - для сохранения несоответствующей информации путем включения несовпадающих строк в результаты объединения, используйте полное внешнее объединение. Он включает все строки из обеих таблиц, независимо от того, имеет ли другая таблица совпадающее значение.
Источник изображения
Справочное руководство по MySQL 8.0 - Синтаксис соединения
Операции Oracle Join
источник
Внутреннее соединение
Извлекать только совпадающие строки, то есть
A intersect B
.Левое внешнее соединение
Выберите все записи из первой таблицы и все записи во второй таблице, которые соответствуют соединенным ключам.
Полное внешнее соединение
Выберите все записи из второй таблицы и все записи в первой таблице, которые соответствуют соединенным ключам.
Ссылки
Внутренние и внешние объединения SQL-примеров и блок Join
SQL: СОЕДИНЯЕТСЯ
источник
Простыми словами:
Внутреннее соединение извлекать только совпавшие строки.
Принимая во внимание, что внешнее соединение извлекает сопоставленные строки из одной таблицы и все строки в другой таблице .... результат зависит от того, какую из них вы используете:
Слева : соответствующие строки в правой таблице и все строки в левой таблице
Справа : соответствующие строки в левой таблице и все строки в правой таблице или
Полный : все строки во всех таблицах. Неважно, есть ли совпадение или нет
источник
Внутреннее объединение показывает только строки, если на другой (правой) стороне объединения имеется соответствующая запись.
На (левом) внешнем соединении отображаются строки для каждой записи с левой стороны, даже если на другой (правой) стороне объединения нет совпадающих строк. Если соответствующей строки нет, столбцы для другой (правой) стороны будут показывать NULL.
источник
Внутренние объединения требуют, чтобы в объединенной таблице существовала запись со связанным идентификатором.
Внешние объединения возвращают записи для левой стороны, даже если для правой стороны ничего не существует.
Например, у вас есть таблица Orders и OrderDetails. Они связаны "OrderID".
заказы
Информация для заказа
Запрос
будет возвращать только заказы, которые также имеют что-то в таблице OrderDetails.
Если вы измените его на OUTER LEFT JOIN
тогда он вернет записи из таблицы Orders, даже если у них нет записей OrderDetails.
Вы можете использовать это, чтобы найти Заказы, у которых нет OrderDetails, указывающего возможный потерянный заказ, добавив предложение where как
WHERE OrderDetails.OrderID IS NULL
.источник
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) с успехом. Я не был уверен насчет дополнительных условий, они хорошо сочетаются ...Простыми словами:
Внутреннее соединение -> Возьмите ТОЛЬКО общие записи из родительской и дочерней таблиц, ГДЕ первичный ключ родительской таблицы соответствует внешнему ключу в дочерней таблице.
Осталось присоединиться ->
псевдокод
Правое соединение : Точно противоположное левому соединению. Поместите имя таблицы в LEFT JOIN справа от правого соединения, вы получите тот же вывод, что и в LEFT JOIN.
Внешнее соединение : Показать все записи в обеих таблицах
No matter what
. Если записи в левой таблице не соответствуют правой таблице, основанной на первичном ключе, ключе Forieign, используйте значение NULL в качестве результата объединения.Пример :
Предположим теперь для 2 таблиц
1.employees , 2.phone_numbers_employees
Здесь таблица employee является главной таблицей, phone_numbers_employees является дочерней таблицей (она содержит
emp_id
внешний ключ, который соединяетemployee.id
ее с дочерней таблицей.)Внутренние соединения
Принимайте записи только из 2 таблиц, ЕСЛИ если первичный ключ таблицы сотрудников (его идентификатор) совпадает с внешним ключом дочерней таблицы phone_numbers_employees (emp_id) .
Таким образом, запрос будет:
Здесь берутся только совпадающие строки в первичном ключе = внешний ключ, как описано выше. Здесь несоответствующие строки в первичном ключе = внешний ключ пропускаются в результате объединения.
Левый присоединяется :
При левом соединении сохраняются все строки левой таблицы, независимо от того, есть ли строка, соответствующая правой таблице.
Внешние соединения :
Схематически это выглядит так:
источник
Вы используете
INNER JOIN
для возврата всех строк из обеих таблиц, где есть совпадение. т.е. в результирующей таблице все строки и столбцы будут иметь значения.В
OUTER JOIN
результирующей таблице могут быть пустые столбцы. Внешнее соединение может быть илиLEFT
илиRIGHT
.LEFT OUTER JOIN
возвращает все строки из первой таблицы, даже если во второй таблице нет совпадений.RIGHT OUTER JOIN
возвращает все строки из второй таблицы, даже если в первой таблице нет совпадений.источник
Это хорошее схематичное объяснение для всех видов соединений
источник: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
источник
INNER JOIN
требует, чтобы при сравнении двух таблиц было как минимум совпадение. Например, таблица A и таблица B, которые подразумевают A ٨ B (пересечение A B).LEFT OUTER JOIN
а такжеLEFT JOIN
такие же. Это дает все записи, совпадающие в обеих таблицах и все возможности левой таблицы.Аналогично
RIGHT OUTER JOIN
иRIGHT JOIN
одинаковы. Это дает все записи, совпадающие в обеих таблицах и все возможности правой таблицы.FULL JOIN
это комбинацияLEFT OUTER JOIN
иRIGHT OUTER JOIN
без дублирования.источник
Ответ заключается в значении каждого, так и в результатах.
Мой ответ основан на примечании выше .
Когда у вас есть две таблицы, подобные этим:
CROSS JOIN / OUTER JOIN:
Вы можете иметь все данные этих таблиц с
CROSS JOIN
или просто,
так:ВНУТРЕННЕЕ СОЕДИНЕНИЕ:
если вы хотите добавить фильтр к вышеуказанным результатам на основе отношения, которое
table1.id = table2.id
вы можете использоватьINNER JOIN
:LEFT [OUTER] JOIN:
Если вы хотите, чтобы все строки одной из таблиц в приведенном выше результате - с одинаковым отношением - вы можете использовать
LEFT JOIN
:(Для RIGHT JOIN просто измените место таблиц)
FULL OUTER JOIN:
Если вы также хотите, чтобы в ваших результатах были все строки другой таблицы, вы можете использовать
FULL OUTER JOIN
:Ну, так как вам нужно, вы выбираете каждый, который покрывает ваши потребности;).
источник
full outer join
в MySQL ее тоже нет.Внутреннее соединение.
Объединение объединяет строки из двух таблиц. Внутреннее объединение попыток , чтобы обеспечить соответствие двух таблиц на основе указанных критериев в запросе, и возвращает только те строки , которые совпадают. Если строка из первой таблицы в соединении совпадает с двумя строками во второй таблице, то в результатах будут возвращены две строки. Если в первой таблице есть строка, которая не соответствует строке во второй таблице, она не возвращается; аналогично, если во второй таблице есть строка, которая не соответствует строке в первой, она не возвращается.
Внешнее Присоединение.
Влево присоединиться попытками найти совпасть строки из первой таблицы , в строки во второй таблице. Если он не может найти совпадение, он вернет столбцы из первой таблицы и оставит столбцы из второй таблицы пустыми (пустыми).
источник
INNER JOIN
наиболее типичное объединение для двух или более таблиц. Возвращает совпадение данных как для таблицы ON primarykey, так и для отношения forignkey.OUTER JOIN
так же, какINNER JOIN
, но он также включает в себяNULL
данные на ResultSet.LEFT JOIN
=INNER JOIN
+ Несоответствующие данные левой таблицы сNull
совпадением на правой таблице.RIGHT JOIN
=INNER JOIN
+ Несоответствующие данные правой таблицы сNull
совпадением на левой таблице.FULL JOIN
=INNER JOIN
+ Несоответствующие данные в правой и левой таблицах сNull
совпадениями.INNER JOIN
иOUTER JOIN
мы можем написать запросы на самостоятельное соединение.Например:
источник
Я не вижу подробностей о производительности и оптимизаторе в других ответах.
Иногда полезно знать, что только
INNER JOIN
ассоциативно, что означает, что оптимизатор имеет больше возможностей для игры с ним. Он может изменить порядок соединения, чтобы сделать его быстрее, сохраняя тот же результат. Оптимизатор может использовать большинство режимов соединения.Как правило, рекомендуется использовать
INNER JOIN
вместо разных видов соединений. (Конечно, если это возможно, учитывая ожидаемый набор результатов.)Здесь есть несколько хороших примеров и объяснений об этом странном ассоциативном поведении:
источник
INNER JOIN
это медленнее, чемLEFT JOIN
в большинстве случаев, и люди могут использоватьLEFT JOIN
вместоINNER JOIN
добавленияWHERE
для удаления неожиданныхNULL
результатов;).INNER
медленнее?Покритиковав столь любимую диаграмму Венна в красных тонах, я подумал, что будет справедливо опубликовать мою собственную попытку.
Несмотря на то, что ответ @Martin Smith является лучшим из этой группы, он показывает только ключевые столбцы из каждой таблицы, в то время как я считаю, что в идеале также должны быть показаны неключевые столбцы.
Лучшее, что я мог бы сделать за полчаса, я все еще не думаю, что это адекватно показывает, что нулевые значения присутствуют из-за отсутствия значений ключей
TableB
или чтоOUTER JOIN
это фактически объединение, а не соединение:источник
TableA a LEFT OUTER JOIN TableB b
наTableB B RIGHT OUTER JOIN TableA a
Точный алгоритм для
INNER JOIN
,LEFT/RIGHT OUTER JOIN
являются следующие:a
(a, b[i])
ON ...
предложение по каждой паре:ON( a, b[i] ) = true/false?
true
, вернуть эту объединенную строку(a, b[i])
.Outer Join
возвращает (виртуальную) пару, используяNull
для всех столбцов другой таблицы:(a, Null)
для внешнего соединения LEFT или(Null, b)
для внешнего соединения RIGHT. Это должно гарантировать, что все строки первой таблицы существуют в окончательных результатах.Примечание: условие, указанное в
ON
предложении, может быть любым, необязательно использовать первичные ключи (и вам не нужно всегда ссылаться на столбцы из обеих таблиц)! Например:... ON T1.title = T2.title AND T1.version < T2.version
(=> просмотреть этот пост в качестве примера использования: выберите только столбцы с максимальным значением в столбце )... ON T1.y IS NULL
... ON 1 = 0
(как образец)Примечание: левое соединение = левое внешнее соединение, правое соединение = правое внешнее соединение.
источник
Простейшие определения
Внутреннее объединение: возвращает сопоставленные записи из обеих таблиц.
Полное внешнее объединение: возвращает сопоставленные и несопоставленные записи из обеих таблиц со значением NULL для несопоставленных записей из обеих таблиц .
Левое внешнее объединение: возвращает сопоставленные и несопоставленные записи только из таблицы на левой стороне .
Правое внешнее объединение: возвращает совпадающие и несопоставленные записи только из таблицы на правой стороне .
Короче говоря
Совпадение + Несоответствие слева + Несоответствие справа = Полное внешнее соединение
Совпадение + Левое Несоответствие = Левое внешнее соединение
Совпадение + Право Несоответствие = Право Наружное соединение
Matched = Inner Join
источник
Проще говоря,
1. INNER JOIN ИЛИ EQUI JOIN: Возвращает набор результатов, который соответствует только условию в обеих таблицах.
2. ВНЕШНЕЕ СОЕДИНЕНИЕ: возвращает набор результатов всех значений из обеих таблиц, даже если условие соответствует или нет.
3. LEFT JOIN: возвращает набор результатов всех значений из левой таблицы и только строк, соответствующих условию в правой таблице.
4. RIGHT JOIN: возвращает набор результатов всех значений из правой таблицы и только строк, соответствующих условию в левой таблице.
5. ПОЛНОЕ СОЕДИНЕНИЕ: полное соединение и полное внешнее соединение - это одно и то же.
источник
Существует два основных типа соединений в SQL: [INNER и OUTER]
Примеры
Предположим, у вас есть две таблицы с одним столбцом и данными следующим образом:
Обратите внимание, что (1,2,7,8) являются уникальными для A, (3,4) являются общими и (5,6) являются уникальными для B.
Ключевое слово INNER JOIN выбирает все строки из обеих таблиц, если выполняется условие. Это ключевое слово создаст набор результатов путем объединения всех строк из обеих таблиц, где выполняется условие, т.е. значение общего поля будет одинаковым.
Результат:
Это объединение возвращает все строки таблицы с левой стороны объединения и совпадающие строки для таблицы с правой стороны объединения. Строки, для которых нет подходящей строки на правой стороне, результирующий набор будет содержать нуль. LEFT JOIN также известен как
LEFT OUTER JOIN
.Результат:
Результат:
ПОЛНОЕ (НАРУЖНОЕ) РЕШЕНИЕ :
FULL JOIN создает результирующий набор, комбинируя результат как LEFT JOIN, так и RIGHT JOIN. Результирующий набор будет содержать все строки из обеих таблиц. Строки, для которых нет соответствия, набор результатов будет содержать значения NULL.
Результат:
источник
Внутреннее объединение - внутреннее объединение, использующее любой из эквивалентных запросов, дает пересечение двух таблиц , то есть двух общих строк, которые они имеют.
Левое внешнее соединение - левое внешнее соединение даст все строки в A, а также все общие строки в B.
Полное внешнее объединение - полное внешнее объединение даст вам объединение A и B, т.е. все строки в A и все строки в B. Если что-то в A не имеет соответствующего элемента в B, то часть B ноль, и наоборот
источник
Join is not an intersection unless the tables have the same columns
Нет. Вы можете присоединиться к любым столбцам, которые вам нужны, и, если значение совпадает, они объединятся.1. Внутреннее объединение: также называется присоединением. Возвращает строки, присутствующие как в левой, так и в правой таблице если есть совпадение . В противном случае он возвращает ноль записей.
Пример:
2. Полное внешнее соединение: также называется полным соединением. Он возвращает все строки, присутствующие как в левой таблице, так и в правой таблице.
Пример:
3. Левое внешнее соединение: или просто называется левым соединением. Он возвращает все строки, присутствующие в левой таблице и соответствующие строки из правой таблицы (если есть).
4. Правое внешнее соединение: также называется правым соединением. Он возвращает совпадающие строки из левой таблицы (если есть) и все строки, присутствующие в правой таблице.
Преимущества Joins
источник
Рассмотрим ниже 2 таблицы:
EMP
отдел
Внутреннее соединение:
В основном написано как просто JOIN в SQL-запросах. Он возвращает только совпадающие записи между таблицами.
Узнайте всех сотрудников и имена их отделов:
Как вы видите выше,
Jose
не выводится из EMP на выходе, так как его dept_id6
не находит соответствия в таблице Department. АналогичноHR
иR&D
строки не распечатываются из отдела таблицы , поскольку они не нашли соответствия в таблице EMP.Таким образом, INNER JOIN или просто JOIN возвращает только совпадающие строки.
СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ:
Это возвращает все записи из таблицы LEFT и только совпадающие записи из таблицы RIGHT.
Таким образом, если вы наблюдаете вышеприведенный вывод, все записи из таблицы LEFT (Emp) печатаются с совпадающими записями из таблицы RIGHT.
HR
иR&D
строки не выводятся из таблицы Department, так как они не нашли соответствия в таблице Emp в dept_id.Таким образом, LEFT JOIN возвращает ВСЕ строки из левой таблицы и только совпадающие строки из правой таблицы.
Также можете проверить ДЕМО здесь .
источник
Общая идея
Пожалуйста , смотрите ответ на Мартина Смита за лучшие illustations и объяснения различных соединений, в том числе и в особенности различия между
FULL OUTER JOIN
,RIGHT OUTER JOIN
иLEFT OUTER JOIN
.Эти две таблицы образуют основу для представления
JOIN
ниже:CROSS JOIN
Результатом будут декартовы произведения всех комбинаций. Никаких
JOIN
условий не требуется:ВНУТРЕННЕЕ СОЕДИНЕНИЕ
INNER JOIN
так же, как просто:JOIN
Результатом будут комбинации, удовлетворяющие требуемому
JOIN
условию:ЛЕВЫЕ НАРУЖНЫЕ
LEFT OUTER JOIN
такой же какLEFT JOIN
Результатом будет все,
citizen
даже если нет совпаденийpostalcode
. Снова требуетсяJOIN
условие:Данные для игры
Все примеры были запущены на Oracle 18c. Они доступны на dbfiddle.uk, откуда также пришли скриншоты таблиц.
Размытые границы при игре с
JOIN
иWHERE
CROSS JOIN
CROSS JOIN
в результате чего строки в качестве общей идеи /INNER JOIN
:Использование
CROSS JOIN
для получения результатаLEFT OUTER JOIN
требует трюков, таких как добавление вNULL
строку. Это опущено.ВНУТРЕННЕЕ СОЕДИНЕНИЕ
INNER JOIN
становится декартовой продукцией. Это так же, как общая идея /CROSS JOIN
:Именно здесь внутреннее соединение действительно можно рассматривать как перекрестное соединение с результатами, не соответствующими удаленному условию. Здесь ни одна из полученных строк не удаляется.
Использование
INNER JOIN
для получения результатаLEFT OUTER JOIN
также требует хитростей. Это опущено.ЛЕВЫЕ НАРУЖНЫЕ
LEFT JOIN
приводит к строкам как общая идея /CROSS JOIN
:LEFT JOIN
приводит к строкам как общая идея /INNER JOIN
:Проблемы с диаграммой Венна
Поиск в интернете по изображению "sql join cross inner external" покажет множество диаграмм Венна. Раньше у меня была печатная копия одного на моем столе. Но есть проблемы с представительством.
Диаграмма Венна отлично подходит для теории множеств, где элемент может быть в одном или обоих наборах. Но для баз данных мне кажется, что элемент в одном «наборе» является строкой в таблице и, следовательно, не присутствует ни в каких других таблицах. Нет такой вещи, как одна строка присутствует в нескольких таблицах. Строка уникальна для таблицы.
Самостоятельные объединения - это угловой случай, когда каждый элемент фактически одинаков в обоих наборах. Но это все еще не свободно ни от одной из проблем ниже.
Набор
A
представляет собой набор слева (citizen
таблица), а наборB
- это набор справа (postalcode
таблица) в обсуждении ниже.CROSS JOIN
Каждый элемент в обоих наборах сопоставляется с каждым элементом в другом наборе, что означает, что нам нужно
A
количество каждогоB
элемента иB
количество каждогоA
элемента, чтобы правильно представить этот декартово произведение. Теория множеств не создана для нескольких идентичных элементов в наборе, поэтому я считаю, что диаграммы Венна правильно представляют ее непрактично / невозможно. Кажется, что это совсем неUNION
подходит.Строки различны. Всего
UNION
7 строк. Но они несовместимы для общегоSQL
набора результатов. И это совсем не такCROSS JOIN
:Попытка представить это так:
..но теперь это просто выглядит как
INTERSECTION
, что это, конечно, нет . Кроме того, в этом элементе нет ниINTERSECTION
одного из двух различных наборов. Тем не менее, это очень похоже на результаты поиска, похожие на это:Для справки один результат поиска для
CROSS JOIN
s можно увидеть на Tutorialgateway . КакINTERSECTION
и этот, пуст.ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Значение элемента зависит от
JOIN
условия. Это можно представить при условии, что каждая строка становится уникальной для этого условия. Значениеid=x
верно только для одного ряда. Как только строка в tableA
(citizen
) соответствует нескольким строкам в tableB
(postalcode
) приJOIN
условии, результат имеет те же проблемы, что иCROSS JOIN
: Строка должна быть представлена несколько раз, и теория множеств на самом деле не создана для этого. Хотя при условии уникальности диаграмма может работать, но имейте в виду, что этоJOIN
условие определяет размещение элемента на диаграмме. Глядя только на значенияJOIN
условия с остальной частью ряда только для поездки:Это представление полностью расходится при использовании
INNER JOIN
сON 1 = 1
условием, превращающим его вCROSS JOIN
.С self-
JOIN
, строки на самом деле являются идентичными элементами в обеих таблицах, но представляют таблицы как обеA
иB
не очень подходят. Например , общее самоJOIN
условие , которое делает элементA
будет сопрягать иной элемент в ВON A.parent = B.child
, что делает матч сA
чтобыB
на отдельно элементах. Из примеров, которые будутSQL
похожи на это:То есть Смит - лидер и Грина, и Дженсена.
НАРУЖНОЕ СОЕДИНЕНИЕ
Опять проблемы начинаются, когда одна строка имеет несколько совпадений со строками в другой таблице. Это дополнительно усложняется тем, что
OUTER JOIN
может соответствовать пустому набору. Но в теории множеств объединение любого множестваC
и пустого множества всегда справедливоC
. Пустой набор ничего не добавляет. Представление этогоLEFT OUTER JOIN
обычно просто показывает все,A
чтобы проиллюстрировать, что строкиA
выбираются независимо от того, есть совпадение или нетB
. Однако у «совпадающих элементов» есть те же проблемы, что и на иллюстрации выше. Они зависят от состояния. И пустой набор, кажется, забрел кA
:ГДЕ оговорка - смысл
Нахождение всех строк
CROSS JOIN
со Смитом и почтовым индексом на Луне:Теперь диаграмма Венна не используется для отражения
JOIN
. Используется только дляWHERE
предложения:... и это имеет смысл.
Когда INTERSECT и UNION имеет смысл
ПЕРЕСЕЧЕНИЕ
Как объяснил, это
INNER JOIN
не совсемINTERSECT
. ОднакоINTERSECT
s можно использовать по результатам отдельных запросов. Здесь диаграмма Венна имеет смысл, поскольку элементы отдельных запросов на самом деле являются строками, которые либо принадлежат только одному из результатов, либо обоим. Очевидно, что Intersect будет возвращать результаты только в том случае, если строка присутствует в обоих запросах. ЭтоSQL
приведет к тому же ряду, что и приведенный вышеWHERE
, и диаграмма Венна также будет такой же:UNION
Ан
OUTER JOIN
не аUNION
. ОднакоUNION
работают в тех же условияхINTERSECT
, что и возвращают все результаты, объединяющие оба параметраSELECT
:что эквивалентно:
..и дает результат:
Также здесь имеет смысл диаграмма Венна:
Когда это не относится
Важным примечанием является то, что они работают только тогда, когда структура результатов двух SELECT одинакова, что позволяет сравнивать или объединять. Результаты этих двух не позволят это:
.. пытается объединить результаты с
UNION
даетДля дальнейшего интереса прочитайте Скажите НЕТ диаграммам Венна при объяснении СОЕДИНЕНИЙ, и соединения sql как диаграмму Венна . Оба также покрывают
EXCEPT
.источник
Здесь есть много хороших ответов с очень точными примерами реляционной алгебры . Вот очень упрощенный ответ, который может быть полезен для начинающих или начинающих программистов с дилеммами кодирования SQL.
В основном, чаще всего запросы
JOIN
сводятся к двум случаям:Для
SELECT
подмножества данныхA
:INNER JOIN
когда связанные данные, которыеB
вы ищете, ДОЛЖНЫ существовать для каждого проекта базы данных;LEFT JOIN
когда связанные данные, которыеB
вы ищете MIGHT или MIGHT NOT, существуют для каждого проекта базы данных.источник
Разница между
inner join
иouter join
заключается в следующем:Inner join
это объединение, объединяющее таблицы на основе совпадающих кортежей, тогдаouter join
как объединение, объединяющее таблицы на основе сопоставленного и несопоставленного кортежа.Inner join
объединяет совпавшую строку из двух таблиц, в которой пропущены несопоставленные строки, тогда какouter join
объединяет строки из двух таблиц, и несопоставленные строки заполняются нулевым значением.Inner join
это как операция пересечения, тогда какouter join
это как операция объединения.Inner join
это два типа, тогдаouter join
как три типа.outer join
быстрее чемinner join
.источник