В чем разница между “ВНУТРЕННИМ СОЕДИНЕНИЕМ” и “ВНЕШНИМ СОЕДИНЕНИЕМ”?

StackOverflow https://stackoverflow.com/questions/38549

Вопрос

Также, как сделать LEFT JOIN, RIGHT JOIN и FULL JOIN вписаться?

Это было полезно?

Решение

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

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

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

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

Левое внешнее соединение даст все строки в A, плюс любые общие строки в 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, т.е.все строки в A и все строки в B.Если что-то в A не имеет соответствующего элемента данных в 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

Другие советы

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

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

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

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

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

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

enter image description here


Объяснение

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

enter link description here

Сначала начните с CROSS JOIN (ОН ЖЕ декартово произведение).У этого нет ON предложение and просто возвращает каждую комбинацию строк из двух таблиц.

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ПЕРЕКРЕСТНОГО СОЕДИНЕНИЯ B

enter link description here

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

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

Несколько примеров

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B НА A.Цвет = B.Цвет

Приведенное выше является классическим равнозначным соединением.

Inner Join

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

enter image description here

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B С A. Цвет, КОТОРОГО НЕТ В ('Зеленый', 'Синий')

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

inner 2

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B НА 1 = 1

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

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B На A.Цвет = B.Цвет

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

LOJ

ВЫБЕРИТЕ A.Color, B.Color ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Color = B.Color, ГДЕ B.Color РАВНО НУЛЮ

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

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

loj is null

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ПРАВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B На A.Цвет = B.Цвет

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

ROJ

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B На A.Цвет = B.Цвет

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

FOJ

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ПРИ 1 = 0

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

FOJ 2

ВЫБЕРИТЕ ОБЪЕДИНИТЬ (A.Цвет, B.Цвет) В качестве цвета ИЗ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ПРИ 1 = 0

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

UNION ALL

ВЫБЕРИТЕ A.Цвет, B.Цвет ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Color = B.Color, ГДЕ B.Color = 'Зеленый'

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

LOJ

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

LOJtoInner

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

ВЫБЕРИТЕ A.Color, B.Color ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B НА A.Color = B.Color И B.Color = 'Зеленый'

enter image description here

SQL Скрипка

Посмотрите на эти примеры запускайте прямой эфир по адресу SQLFiddle.com.

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

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

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

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

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

Правое внешнее соединение: - Правое внешнее соединение (или правое соединение) очень похоже на левое внешнее соединение, за исключением обработки обращенных таблиц. Каждый ряд из «правого» таблица ( Местоположение ) появится в объединенной таблице хотя бы один раз. Если нет подходящей строки из " слева " таблица ( Сотрудник ) существует, в столбцах Сотрудник появятся значения NULL для тех записей, которые не совпадают в Расположение . Вот как выглядит SQL:

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

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

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

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

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

Ан внутреннее соединение извлекайте только совпадающие строки.

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

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

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

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

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

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

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

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

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

Приказы

  • Порядковый номер
  • Имя пользователя

Детали заказа

  • Идентификатор заказа
  • Порядковый номер
  • Название продукта
  • Кол-во
  • Цена

Просьба

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.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.

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

Пример:

Пример

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

1.employees, 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

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

Внутренние объединения

Взять записи из 2 таблиц. ТОЛЬКО ЕСЛИ если первичный ключ таблицы сотрудников (его идентификатор) совпадает с внешним ключом дочерней таблицы 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;

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

Diagram

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

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

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

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

 Это хорошее объяснение для объединений

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

источник: http://ssiddique.info/understanding-sql- присоединяется к-в-простой way.html

INNER JOIN требует, чтобы при сравнении двух таблиц было как минимум совпадение. Например, таблица A и таблица B, которые подразумевают A & # 1640; B (пересечение B).

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

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

FULL JOIN - это сочетание LEFT OUTER JOIN и RIGHT OUTER JOIN без дублирования.

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

  

Примечание.
  В 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 / OUTER JOIN:
Вы можете получить данные всех этих таблиц с помощью 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
<Ч>

ВНУТРЕННЕЕ СОЕДИНЕНИЕ:
Если вы хотите добавить фильтр к вышеуказанным результатам на основе отношения, такого как 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 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

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

Внутреннее объединение.

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

Внешнее соединение.

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

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

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

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

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

Точный алгоритм для 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 затем верните a (виртуальный) сопряжение с использованием Null для всех столбцов другой таблицы: (a, Null) для ЛЕВОГО внешнего соединения или (Null, b) для ПРАВОГО внешнего соединения.Это делается для того, чтобы убедиться, что все строки первой таблицы существуют в конечных результатах.

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

Inner Join vs. Left Outer Join


enter image description here

Примечание: Левое соединение = Левое внешнее соединение, Правое соединение = Правое внешнее соединение.

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

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

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

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

enter image description here

  • INNER JOIN наиболее типичное объединение для двух или более таблиц.Он возвращает совпадение данных как в таблице ПО отношению primarykey, так и по отношению forignkey.
  • OUTER JOIN это то же самое, что INNER JOIN, но это также включает в себя NULL данные в результирующем наборе.
    • LEFT JOIN = INNER JOIN + Непревзойденные данные о слева стол с Null спичка на правом столе.
    • RIGHT JOIN = INNER JOIN + Непревзойденные данные о правильно стол с Null спичка на левом столе.
    • FULL JOIN = INNER JOIN + Непревзойденные данные по как справа, так и слева таблицы с Null Матчи.
  • Self join не является ключевым словом в SQL, когда таблица ссылается на данные, которые сами по себе известны как self join.Используя 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 

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

Внутреннее соединение:ВОЗВРАТ совпадающие записи из обеих таблиц.

Полное Внешнее соединение:Возвращает совпадающие и непревзойденные рекорды из обеих таблиц с null для несопоставимых записей из Обе Таблицы.

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

Правое Внешнее соединение:Возвращает совпадающие записи только из таблицы на Правая сторона.

Короче говоря

Совпадающий + Левый Несопоставимый + Правый несопоставимый = Полное Внешнее соединение

Подобранный + Оставленный непревзойденным = Левое Внешнее соединение

Подобранный + Правильно Подобранный = Правое Внешнее соединение

Подобранный = Внутреннее соединение

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

1. ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИЛИ СОЕДИНЕНИЕ EQUI: Возвращает набор результатов, который соответствует только условию в обеих таблицах.

2. ВНЕШНЕЕ СОЕДИНЕНИЕ . Возвращает набор результатов всех значений из обеих таблиц, даже если условие соответствует или нет.

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

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

5. ПОЛНОЕ СОЕДИНЕНИЕ: полное и полное внешнее объединение совпадают.

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

Пример:

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

output1

2.Полное Внешнее соединение: Также называется полным соединением.Он возвращается все строки присутствует как в Левой таблице, так и в правой таблице.

Пример:

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

output2

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

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

joins

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

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

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

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

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

правое объединение (on aka правое внешнее объединение ) возвращает внутреннее объединение в строках объединение всех , несопоставленное право строки таблицы расширены нулями.

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

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

Так что не используйте external join , пока не узнаете, что лежит в основе inner join .

<Ч>

Узнайте, какие строки внутреннее соединение возвращает .

Прочитайте мои комментарии, там много запутанных & amp; плохие ответы.

Тогда прочитайте мои комментарии здесь, многие из которых запутались & amp; плохие ответы.

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

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

    ЭМИ

    empid   name    dept_id salary
    1       Rob     1       100
    2       Mark    1       300
    3       John    2       100
    4       Mary    2       300
    5       Bill    3       700
    6       Jose    6       400
    

    Отдел

    deptid  name
    1       IT
    2       Accounts
    3       Security
    4       HR
    5       R&D
    

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

    В основном пишется как просто Присоединиться в sql-запросах.Он возвращает только совпадающие записи между таблицами.

    Узнайте имена всех сотрудников и их отделов:

    Select a.empid, a.name, b.name as dept_name
    FROM emp a
    JOIN department b
    ON a.dept_id = b.deptid
    ;
    
    empid   name    dept_name
    1       Rob     IT
    2       Mark    IT
    3       John    Accounts
    4       Mary    Accounts
    5       Bill    Security
    

    Как вы видите выше, Jose не печатается с ЭМИ в выходных данных как это dept_id 6 не находит совпадения в таблице отдела.Аналогично, HR и R&D строки не печатаются из Отдел таблица, поскольку они не нашли совпадения в таблице Emp.

    Итак, ВНУТРЕННЕЕ СОЕДИНЕНИЕ или просто JOIN возвращает только совпадающие строки.

    ЛЕВОЕ СОЕДИНЕНИЕ :

    Это возвращает все записи из ЛЕВОЙ таблицы и только соответствующие записи из ПРАВОЙ таблицы.

    Select a.empid, a.name, b.name as dept_name
    FROM emp a
    LEFT JOIN department b
    ON a.dept_id = b.deptid
    ;
    
    empid   name    dept_name
    1       Rob     IT
    2       Mark    IT
    3       John    Accounts
    4       Mary    Accounts
    5       Bill    Security
    6       Jose    
    

    Итак, если вы обратите внимание на приведенный выше вывод, все записи из ЛЕВОЙ таблицы (Emp) печатаются только с соответствующими записями из ПРАВОЙ таблицы.

    HR и R&D строки не печатаются из Отдел таблица, поскольку они не нашли совпадения в таблице Emp по dept_id.

    Итак, LEFT JOIN возвращает ВСЕ строки из левой таблицы и только соответствующие строки из ПРАВОЙ таблицы.

    Также можете проверить ДЕМО-версию здесь.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top