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


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

30   4099   2008-09-02 02:36:06

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 не имеет соответствующего датума в 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

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

visual explanation of joins

источник: визуальное представление-о-в SQL-соединения подробно объяснил C. L. Moffatt

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

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

enter image description here

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

enter image description here

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

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

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

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

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

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

enter image description here


объяснение

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

enter link description here

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

выберите A. цвет, B. цвет из перекрестного соединения 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') на каждую строку возвращается перекрестное соединение.

inner 2

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

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

выберите цвет А. Б. цвету от левого внешнего соединения B на А. цвет = Б. цвет

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

LOJ

выберите цвет А. Б. цвету от левого внешнего соединения B на А. цвет = Б. Б. цвет, где цвет имеет значение null

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

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

loj is null

выберите цвет А. Б. цвета из правого внешнего соединения B на А. цвет = цвет Б.

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

ROJ

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

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

FOJ

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

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

FOJ 2

выбрать КОАЛЕСЦИРУЮТ (A. цвет, B. цвет) как цвет от полного внешнего соединения B на 1 = 0

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

UNION ALL

А. выберите цвет, в. цвет от левого внешнего соединения 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)

RIGHT JOIN

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

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

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

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

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

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

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

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

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

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

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

заказы

  • OrderID
  • CustomerName

OrderDetails

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

запрос

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

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

внешние соединения : показать все записи в обеих таблицах 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;

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

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 / 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 [OUTER] JOIN:
Если вы хотите иметь все строки одной из таблиц в приведенном выше результате - с тем же отношением - вы можете использовать LEFT JOIN:
(Для RIGHT 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: возвращает совпадающие и несопоставимые записи только из таблицы на Левый.

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

В-Короткий

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

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

Соответствует + Право Не Имеет Себе Равных = Правое Внешнее Соединение

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

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

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

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

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

например:

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) для условия поиска.
  • The UserId IS NULL условие поиска 'принадлежит' к OUTER JOIN но отключен в запрос.
  • LEFT это отраслевой стандарт: профессионалы перепишут запрос, чтобы избежать использования RIGHT!
  • The OUTER ключевое слово LEFT OUTER JOIN опущен.

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

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

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

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

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

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

1.INNER JOIN ИЛИ EQUI JOIN: возвращает результирующий набор, который соответствует только условию в обеих таблицах.

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

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

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

5. ПОЛНОЕ СОЕДИНЕНИЕ: полное соединение и полное внешнее соединение одинаковы.

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

пример:

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. внутреннее соединение-это соединение, которое в сочетании таблицами на основе совпадающих кортежей, в то время как внешнее соединение, что в сочетании таблицу, основанную на совпадающие и не совпадающие кортежа.
  2. внутреннее соединение объединяет совпадающие строки из двух таблиц, в которых несопоставимые строки опущены, тогда как внешнее соединение объединяет строки из двух таблиц и несопоставимые строки заполняются нулевым значением.
  3. внутреннее соединение похоже на пересечение операция, тогда как внешнее соединение похоже на операцию объединения.
  4. внутреннее соединение-это два типа, тогда как внешнее соединение-это три типа.
  5. внутреннее соединение медленнее, в то время как внешнее соединение быстрее, чем внутреннее соединение.