В чем разница между "внутренним соединением" и "внешним соединением"?

и как LEFT JOIN, RIGHT JOIN и FULL JOIN подходят?

30 ответов


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

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

  • внешнее соединение 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, плюс любые общие строк в Б.

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 не имеет соответствующего datum в B, то часть B равна null, и наоборот.

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

также вы можете рассмотреть следующую схему для разных типов соединений;

visual explanation of joins

источник: визуальное представление-о-в SQL-соединения подробно объяснено С. Л. Моффатт


рекомендую статья в блоге Джеффа. Лучшее описание, которое я когда-либо видел, плюс есть визуализация, например:

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

enter image description here

Полное Внешнее Соединение:

enter image description here


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

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

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

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

(NB: на практике оптимизатор запросов может найти более эффективные способы выполнения запроса, чем чисто логическое описание выше, но конечный результат должен быть таким же)

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

enter image description here


объяснение

Таблицы Источник

enter link description here

первый старт с CROSS JOIN (продукт АКА декартовой). Это не имеет ON предложения и просто возвращает каждую комбинацию строк из двух таблиц.

выберите A. цвет, B. цвет от перекрестного соединения Б

enter link description here

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

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

примеры

выберите A. цвет, B. цвет из A Внутреннее соединение B на A. цвет = B. цвет

выше-классическое соединение equi.

Inner Join

Анимационная Версия

enter image description here

выберите A. цвет, B. цвет из внутреннего соединения B на A. цвет не в ("зеленый", "синий")

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

inner 2

выберите A. цвет, B. цвет от внутреннего соединения B на 1 =1

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

выберите A. цвет, B. цвет из левого внешнего соединения B на A. цвет = B. цвет

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

LOJ

выберите A. цвет, B. цвет из левого внешнего соединения B на A. цвет = B. цвет, где B. цвет равен NULL

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

важно выбрать столбец для IS NULL тест, который либо не аннулируется, либо для которого условие соединения гарантирует, что any 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. цвет = B. цвет, где B. цвет = 'зеленый'

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

LOJ

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

LOJtoInner

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

выберите A. цвет, B. цвет из левого внешнего соединения B на A. цвет = B. цвет и B. цвет = 'зеленый'

enter image description here

SQL Fiddle

посмотреть эти примеры run live at SQLFiddle.com.


из статьи было взято следующее:"MySQL-левое соединение и правое соединение, внутреннее соединение и внешнее соединение" Грэм Эллис в своем блоге Horse's Mouth.

в базе данных, такой как MySQL, данные делятся на несколько таблиц, которые затем подключаются (Joined) вместе с JOIN на SELECT команды для чтения записей из нескольких таблиц. Прочтите этот пример, чтобы увидеть, как он работает.

во-первых, некоторые образцы данные:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

РЕГУЛЯРНОЕ ПРИСОЕДИНЕНИЕ

если мы делаем регулярное соединение (без ключевых слов INNER, OUTER, LEFT или RIGHT), то получаем все записи, которые соответствующим образом совпадают в двух таблицах, а записи в обеих входящих таблицах, которые не совпадают, не сообщаются:

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

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

если мы сделаем левое соединение, мы получим все записи, которые совпадают таким же образом, и, кроме того, мы получим дополнительную запись для каждая непревзойденная запись в левой таблице соединения-таким образом, гарантируя (в этом примере), что каждый человек получает упоминание:

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

ПРАВОЕ СОЕДИНЕНИЕ

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

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

внутреннее соединение делает полный присоединяйтесь, как и в первом примере, и слово OUTER может быть добавлено после слова LEFT или RIGHT в последних двух примерах - это предусмотрено для совместимости ODBC и не добавляет дополнительных возможностей.


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

enter image description here

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

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Теперь, вот как будет выглядеть результат запуска этого SQL: enter image description hereenter image description here

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

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

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

Теперь, вот как будет выглядеть результат запуска этого SQL: enter image description hereenter image description here

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

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

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

enter image description hereenter image description here

Полные Внешние Соединения:- Полное внешнее соединение или полное соединение-сохранить информацию о несоответствии, включив строки несоответствия в результаты соединения, используйте полное внешнее соединение. Он включает все строки из обеих таблиц, независимо от того, имеет ли другая таблица соответствующее значение. enter image description here

Источник Изображения

MySQL 8.0 Справочное Руководство - Join Синтаксис

Oracle Join operations


Внутреннее Соединение

извлечь только совпадающие строки, то есть A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Левое Внешнее Соединение

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

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Полное Внешнее Соединение

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

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

ссылки


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

An внутреннее соединение получить только совпадающие строки.

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

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

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

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


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

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


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

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

например, у вас есть заказы и таблица OrderDetails. Они связаны "Кодзаказа".

заказы

  • OrderID
  • CustomerName

OrderDetails

  • OrderDetailID
  • OrderID
  • ProductName
  • кол
  • цена

запрос

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

будет возвращать только заказы, которые также имеют что-то в таблице OrderDetails.

Если вы измените его на внешний левый JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

тогда он будет возвращать записи из таблицы заказов, даже если у них нет записей 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.
    }
  }

право на вступление: ровно напротив левого соединения . Поместите имя таблицы в левое соединение с правой стороны в правое соединение , вы получите тот же результат, что и левый ПРИСОЕДИНЯТЬСЯ.

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

пример :

Example

предположим теперь для 2 таблицы

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

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

внутреннее соединение

возьмите записи 2 таблиц только если первичный ключ таблицы employees(его id) соответствует внешнему ключу дочерней таблицы 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;

здесь возьмите только совпадающие строки на первичном ключе = внешний ключ, как описано выше.Здесь не совпадающие строки на первичном ключе = внешний ключ пропущено в результате соединения.

слева присоединяется :

LEFT join сохраняет все строки левой таблицы, независимо от того, есть ли строка, которая соответствует правой таблице.

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;

Diagramatically это выглядит так :

Diagram


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

на OUTER JOIN в результирующей таблице могут быть пустые столбцы. Внешнее соединение может быть либо LEFT или RIGHT.

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

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


This is a good explanation for joins

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

источник:http://ssiddique.info/understanding-sql-joins-in-easy-way.html


INNER JOIN требуется, по крайней мере, совпадение при сравнении двух таблиц. Например, таблица A и таблица B, которая подразумевает A ٨ 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 или , такой:

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

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


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

  • JOIN то же самое, что INNER JOIN и означает показывать только записи общего для обеих таблиц. Являются ли записи общими, определяется полями в предложении join. Например:

    FROM t1
    JOIN t2 on t1.ID = t2.ID
    

    означает показывать только записи, где то же самое ID значение существует в обеих таблицах.

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

  • RIGHT JOIN это то же самое, что RIGHT OUTER JOIN и означает, напротив LEFT JOIN, т. е. показывает все записи из второй (правой) таблицы и только соответствующие записи из первой (левой) таблицы.

источник: в чем разница между левым, правым, внутренним, внешним, соединением?


внутреннее соединение.

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

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

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


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

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

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

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


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

JOIN это то же самое, что INNER JOIN и означает показывать только записи общего для обеих таблиц. Являются ли записи общими, определяется полями в предложении join.

например:

SELECT * 
FROM t1
JOIN t2 on t1.ID = t2.ID

это означает показать только записи, где то же самое ID значение существует в обеих таблицах.

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

RIGHT JOIN это то же самое, что RIGHT OUTER JOIN и означает, напротив LEFT JOIN, т. е. показывает все записи из второй (правой) таблицы и только соответствующие записи из первой (левой) таблицы.


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

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

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

enter image description here


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

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

Inner Join vs. Left Outer Join


enter image description here

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


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

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

существует три типа внешних соединений:

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


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

Внутреннее Соединение: Возвращает соответствующие записи из обеих таблиц.

полное внешнее соединение возвращает соответствует и несопоставленные записи из обеих таблиц с null для непревзойденных записей из Обе Таблицы.

Left Outer Join: возвращает сопоставленные и непревзойденные записи только из таблицы on Левый.

правое внешнее соединение: возвращает сопоставленные и непревзойденные записи только из таблицы на Справа.

В-Короткий

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

Соответствует + Левый Непревзойденный = Левое Внешнее Соединение

Соответствует + Право Непревзойденный = Правое Внешнее Соединение

совпали = Внутреннее Соединение


ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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

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

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

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

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

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

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

Дополнительные ссылка


enter image description here

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

в чем разница между "внутренним соединением" и "внешним соединением"?

они являются наиболее часто используемыми экзистенциальными операторами в SQL, где INNER JOIN используется для 'существует' и LEFT OUTER JOIN используется для "не существует".

рассмотрим эти вопросы:

users who have posted and have votes
users who have posted but have no badges

люди, которые ищут решения на основе набора (отраслевой термин), распознают соответствующие запросы как:

users who have posted INTERSECT users who have votes
users who have posted MINUS users who have badges

переводя их в стандартный В SQL:

SELECT UserId FROM Posts
INTERSECT 
SELECT UserId FROM Votes;

SELECT UserId FROM Posts
EXCEPT 
SELECT UserId FROM Badges;

другие будут думать аналогично в включения:

users who have posted and IN the set of users who have votes
users who have posted and NOT IN the set of users who have badges

перевод их в стандартный SQL:

SELECT UserId 
  FROM Posts
 WHERE UserId IN ( SELECT UserId FROM Votes );

SELECT UserId 
  FROM Posts
 WHERE UserId NOT IN ( SELECT UserId FROM Badges );

некоторые будут думать в терминах "существования" в наборах, например

users who have posted and EXIST in the set of users who have votes
users who have posted and do NOT EXIST in the set of users who have badges

перевод их в стандартный SQL (обратите внимание, что теперь нам нужно использовать переменные диапазона, т. е. p, v, b):

SELECT p.UserId 
  FROM Posts p
 WHERE EXISTS ( SELECT *
                  FROM Votes v
                 WHERE v.UserId = p.UserId );

SELECT p.UserId 
  FROM Posts p
 WHERE NOT EXISTS ( SELECT *
                      FROM Badges b
                     WHERE b.UserId = p.UserId );

однако я обнаружил, что подход "отраслевого стандарта" заключается исключительно в использовании присоединяется. Я не знаю, о чем здесь думают (закон прибора? преждевременная оптимизация?), поэтому я сразу перейду к синтаксису:

SELECT p.UserId 
  FROM Posts p
       INNER JOIN Votes v ON v.UserId = p.UserId;

SELECT p.UserId 
  FROM Posts p
       LEFT JOIN Badges b ON b.UserId = p.UserId
 WHERE b.UserId IS NULL;

Примечание:

  • единственная проекция-от Users но нам все еще нужны все эти переменные диапазона (p, v, b) для условия поиска.
  • на UserId IS NULL условие поиска 'принадлежит' к OUTER JOIN но отключен в запрос.
  • LEFT является отраслевым стандартом: профессионалы переписать запрос, чтобы не использовать RIGHT!
  • на OUTER ключевое слово LEFT OUTER JOIN опущен.

заключительное слово:

иногда соединения используются в запросах исключительно для определения того, существуют или не существуют значения в другом наборе. Научитесь внимательно смотреть на проецируемые атрибуты (столбцы в SELECT пункта): если нет ни одного из соединяемых таблица тогда они просто используются как экзистенциальные операторы. Кроме того, для внешнего соединения найдите экземпляры <key_column> IS NULL на WHERE предложения.


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

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

  • полное внешнее соединение - A полное внешнее соединение даст вам объединение A и B, т. е. всех строк в A и всех строк в B. Если что-то в A не имеет соответствующего datum в B, то часть B равна null, и наоборот


Проще Говоря,

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

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

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

4.ПРАВОЕ СОЕДИНЕНИЕ: возвращает результирующий набор всех значений из правой таблицы и только строк, соответствующих условию в левой таблице.

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.левое внешнее соединение: или просто называют уехал. Он возвращает все строки, присутствующие в левой таблице и соответствующие строки из правой таблицы (если таковые имеются).

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

joins

преимущества присоединяется

  1. выполняется быстрее.

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

  1. Inner join-это соединение, объединяющее таблицы на основе совпадающих кортежей, тогда как outer join-это соединение, объединяющее таблицу на основе совпадающего и несопоставимого кортежа.
  2. внутреннее соединение объединяет совпадающую строку из двух таблиц, в которых не совпадающая строка опущена, в то время как внешнее соединение объединяет строки из двух таблиц и не совпадающие строки заполняются нулевым значением.
  3. внутреннее соединение похоже на пересечение операция, тогда как внешнее соединение похоже на операцию объединения.
  4. внутреннее соединение-два типа, тогда как внешнее соединение-три типа.
  5. внутреннее соединение медленнее, тогда как внешнее соединение быстрее, чем внутреннее соединение.