В чем разница между "INNER JOIN" и "OUTER JOIN"?

Также как LEFT JOIN, RIGHT JOIN и FULL JOIN вписываются?

3690
задан Chris de Vries 02 сент. '08 в 1:36
источник поделиться

32 ответов

  • 1
  • 2

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

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

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

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

Левое внешнее соединение даст все строки в плюс любые общие строки в 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, т.е. все строки в и все строки в B. Если что-то в не имеет соответствующей базы данных в 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
5058
ответ дан Mark Harrison 02 сент. '08 в 1:59
источник поделиться

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

visual explanation of joins

Источник: Visual-Representation-of-SQL-Joins подробно объясняется C.L. Моффат

2259
ответ дан Teoman shipahi 17 мая '13 в 2:03
источник поделиться

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

Внутренняя регистрация:

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

Полный Outer Join:

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

556
ответ дан ya23 30 авг. '09 в 14:52
источник поделиться

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

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

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

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

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

enter link description here

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

SELECT A.Colour, B.Colour FROM A CROSS JOIN B

enter link description here

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

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

Некоторые примеры

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour = B.Colour

Вышеприведенное классическое объединение equi.

Inner Join

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN ( "Зеленый", "Синий" )

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

inner 2

SELECT A.Colour, B.Colour FROM IN INER JOIN B ON 1 = 1

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

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour

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

LOJ

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

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

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

loj is null

SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour

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

ROJ

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour

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

FOJ

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0

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

FOJ 2

SELECT COALESCE (A.Colour, B.Colour) AS Color FROM FULL OUTER JOIN B ON 1 = 0

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

UNION ALL

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'

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

LOJ

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

LOJtoInner

Если намерение состояло в том, чтобы включать только строки из B, где Color - Green, а все строки из A, независимо от правильного синтаксиса, -

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour AND B.Colour = 'Green'

enter image description here

SQL Fiddle

Смотрите эти примеры запустите live на SQLFiddle.com.

428
ответ дан Martin Smith 13 дек. '14 в 14:58
источник поделиться

Из статьи "MySQL - ЛЕВЫЙ ПРИСОЕДИНЕНИЕ И ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, ВНУТРЕННЯЯ ВСТРЕЧА И ВЗАИМОДЕЙСТВИЕ" Грэм Эллис в своем блоге Horse Mouth.

p >

В базе данных, такой как 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)

REGULAR JOIN

Если мы выполняем регулярный JOIN (без каких-либо ключевых слов 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)

LEFT JOIN

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

   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)

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

Если мы делаем ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, мы получаем все записи, которые соответствуют и IN ADDITION, дополнительную запись для каждой несогласованной записи в правой таблице соединения - в моем примере, это означает, что каждое свойство получает упоминание, даже если мы не имеют деталей продавца:

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)

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

268
ответ дан gtiwari333 14 февр. '11 в 8:53
источник поделиться

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

Получить только сопоставленные строки, то есть 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

Ссылки

102
ответ дан Tushar Gupta 27 янв. '14 в 15:16
источник поделиться

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

внутреннее соединение извлекает только согласованные строки.

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

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

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

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

89
ответ дан vidyadhar 12 янв. '13 в 14:07
источник поделиться

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

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

82
ответ дан 1800 INFORMATION 02 сент. '08 в 1:38
источник поделиться

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

enter image description here

Внутреннее соединение: Внутреннее объединение создает новую таблицу результатов, комбинируя значения столбцов двух таблиц (Employee and 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: enter image description hereвведите описание изображения здесь

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

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

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

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

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

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

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

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

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

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

79
ответ дан ajitksharma 18 дек. '14 в 9:54
источник поделиться

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

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

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

Заказы

  • OrderID
  • CustomerName

Детали_Заказов

  • OrderDetailID
  • OrderID
  • ProductName
  • Количество
  • Цена

Запрос

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

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

Если вы измените его на OUTER LEFT JOIN

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

то он будет возвращать записи из таблицы Orders, даже если у них нет записей OrderDetails.

Вы можете использовать это, чтобы найти Заказы, у которых нет каких-либо OrderDetails, указывающих на возможный осиротевший порядок, добавив предложение where, подобное WHERE OrderDetails.OrderID IS NULL.

59
ответ дан Brian Boatright 02 сент. '08 в 1:47
источник поделиться

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

Внутреннее соединение → Принимать ТОЛЬКО общие записи из родительских и дочерних таблиц. ГДЕ первичный ключ родительской таблицы соответствует внешнему ключу в таблице "Дети".

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

псевдокод

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.

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

Пример:

Example

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

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

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

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

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

51
ответ дан Pratik C Joshi 19 февр. '15 в 7:50
источник поделиться

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

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

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

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

47
ответ дан vijikumar 27 сент. '12 в 10:33
источник поделиться

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

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

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

43
ответ дан Raghu K Nair 22 марта '16 в 1:57
источник поделиться

INNER JOIN требуется, по крайней мере, совпадение при сравнении двух таблиц. Например, таблица A и таблица B, которая подразумевает A 8 B (пересечение A).

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

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

FULL JOIN представляет собой комбинацию LEFT OUTER JOIN и RIGHT OUTER JOIN без дублирования.

41
ответ дан naga 02 сент. '10 в 12:49
источник поделиться

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

Примечание:
В 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

INNER JOIN:
Если вы хотите добавить фильтр к приведенным выше результатам на основе отношения типа 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

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

33
ответ дан shA.t 13 апр. '15 в 16:07
источник поделиться

В SQL A join используется для сравнения и объединения - буквально join - и возвращает определенные строки данных из двух или более таблиц в базе данных. внутреннее соединение находит и возвращает соответствующие данные из таблиц, а внешнее соединение находит и возвращает соответствующие данные и некоторые несходные данные из таблиц.

Внутренняя регистрация

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

Пример внутреннего подключения

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

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

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

Внешняя связь

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

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

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

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

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

Пример левого соединения

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

Outer_left

Right Outer Join

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

Пример правого соединения

Как и в примере left join, вывод правого внешнего соединения включает в себя все строки внутреннего соединения и двух строк - брокколи и squash - из "правой" (таблица количества), которые не имеют соответствующих записей слева.

right-join

Полная внешняя подписка

A полное внешнее соединение или полное соединение, которое не поддерживается популярной системой управления базами данных MySQL, объединяет и возвращает все данные из двух или более таблиц независимо от того, существует ли общая информация. Подумайте о full join как о простом дублировании всей указанной информации, но в одной таблице, а не в нескольких таблицах. Если отсутствуют совпадающие данные, будут выданы нули.

Full-Outer_join

32
ответ дан Ved Prakash 21 янв. '17 в 20:39
источник поделиться

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

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

Внешняя связь.

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

26
ответ дан Kanwar Singh 11 апр. '14 в 12:18
источник поделиться

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

  • 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, то есть отображает все записи из второй (правой) таблицы и только совпадения записей из первой (левой) таблицы.

Источник: В чем разница между LEFT, RIGHT, INNER, OUTER, JOIN?

26
ответ дан Aldee 18 сент. '13 в 5:36
источник поделиться

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

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

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

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

20
ответ дан Lajos Veres 17 нояб. '13 в 15:59
источник поделиться

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

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, то есть отображает все записи из второй (правой) таблицы и только соответствующие записи из первой (левой) таблицы.

19
ответ дан Rahul Parit 04 мая '15 в 12:09
источник поделиться

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

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

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

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

15
ответ дан onedaywhen 22 янв. '16 в 18:23
источник поделиться

Точный алгоритм для INNER JOIN, LEFT/RIGHT OUTER JOIN выглядит следующим образом:

  • Возьмите каждую строку из первой таблицы: a
  • Рассмотрим все строки из второй таблицы: (a, b[i])
  • Оцените ON clause для каждой пары: ON(a, b[i]) = true/false?
    • Когда условие оценивается до true, верните его.
    • Для (слева/справа) Outer Joins: если конец конца второй таблицы без какого-либо совпадения, верните (виртуальную) пару, используя Null для всех столбцов второй таблицы: (a, Null). Это делается для обеспечения того, чтобы все конечные результаты в первой таблице существовали.

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

Внутреннее соединение против левого внешнего соединения


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

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

14
ответ дан S.Serp 08 нояб. '16 в 15:25
источник поделиться

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

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

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

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

13
ответ дан Sumudu De Zoysa 07 сент. '15 в 13:53
источник поделиться

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

Inner Join: возвращает сопоставленные записи из обеих таблиц.

Full Outer Join: возвращает сопоставленные и несвязанные записи из обеих таблиц с нулевым значением для несравнимых записей из Обе таблицы.

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

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

В-Short

Совпадение + Слева Непревзойденное + Правое Непревзойденное = Полное внешнее соединение

Совпадение + Левое Непревзойденное = Левое внешнее соединение

Совпадает + Прямо Непревзойденное = Прямое внешнее соединение

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

13
ответ дан Akshay Khale 28 апр. '16 в 12:10
источник поделиться

INNER JOIN

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

ВЛЕВОЕ ВЗАИМОДЕЙСТВИЕ

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

ПРАВОЙ ВНЕШНИЙ ВХОД

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

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

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

Для более Ссылка

11
ответ дан AVI 20 дек. '15 в 4:30
источник поделиться

В чем разница между "INNER JOIN" и "OUTER JOIN"?

Они являются наиболее часто используемыми экзистенциальными операторами в 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.

5
ответ дан onedaywhen 30 сент. '16 в 14:04
источник поделиться
  • Внутреннее соединение. внутреннее соединение с использованием любого из эквивалентных запросов дает пересечение двух таблиц, то есть двух строк, которые они имеют вместе.

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

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

4
ответ дан Sandesh 02 февр. '16 в 14:43
источник поделиться

В простых условиях

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

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

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

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

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

3
ответ дан Anands23 13 окт. '16 в 11:53
источник поделиться

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. Full Outer Join: Также называется Full Join. Он возвращает все строки, присутствующие как в левой таблице, так и в правой таблице.

Пример:

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

join

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

  • Выполняется быстрее.
3
ответ дан Preya 10 июля '17 в 14:56
источник поделиться

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

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

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

Внутренние соединения не включают несогласованные строки; тогда как внешние объединения включают их. Давайте немного углубимся в механику каждого

Механика внутренней связи

Внутреннее соединение используется для возврата результатов путем объединения строк из двух или более таблиц.

В своем простейшем случае, когда нет условия соединения, внутреннее объединение объединит все строки из одной таблицы с данными из другого. Если первая таблица содержала три строки, а вторая, четыре, то окончательный результат содержал бы двенадцать (3 x 4 = 12)!

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

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

Таблицы для присоединения. Обратно, если у человека нет номера телефона, тогда в PersonPhone не будет записи, и никакого совпадения не будет. Этот конкретный человек не будет включен в результаты, так как включены только те, у кого есть спички. Попробуем пример. Предположим, что HR Manager хочет создать телефонный каталог. Им нужны имена людей, фамилия, название и номера телефонов. Какой запрос вы могли бы использовать для создания этого? Вот то, что могло бы сделать трюк:

SELECT   P.FirstName,
         P.LastName,
         P.Title,
         PH.PhoneNumber
FROM     Person.Person AS P
         INNER JOIN
         Person.PersonPhone AS PH
         ON P.BusinessEntityID = PH.BusinessEntityID
         AND PH.PhoneNumberTypeID = 3
ORDER BY P.LastName

INNER JOIN задает, какие таблицы для соединения и условия соответствия для этого. Условие PH.Phone NumberTyeID = 3 ограничивает запрос рабочими числами. Если вы выполните вышеуказанное, вы получите следующие результаты:

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

Внутренние результаты присоединения Помните, что внутреннее соединение возвращает строку, где условие соответствия истинно. В этом примере строки, в которых идентификаторы BusinessEntityID не совпадают, содержат arent. Это может быть проблемой, если у человека нет номера телефона, так как эти сотрудники не будут в списке. Если вы хотите включить этих сотрудников, вы можете использовать Outer join.

Механизм внешней механики

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

SELECT   P.FirstName,
         P.LastName,
         P.Title,
         PH.PhoneNumber
FROM     Person.Person AS P
         LEFT OUTER JOIN
         Person.PersonPhone AS PH
         ON P.BusinessEntityID = PH.BusinessEntityID
         AND PH.PhoneNumberTypeID = 3
ORDER BY P.LastName

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

введите описание изображения здесь Outer Join Results Обратите внимание, что в примере PhoneNumber для Catherine Abel имеет значение NULL. Это связано с тем, что рабочий номер Catherines не указан, и во время соединения не было найдено совпадений. Если бы это было внутреннее соединение, то эта строка не была бы включена в результаты.

3
ответ дан Nitin Kumar 11 окт. '16 в 13:50
источник поделиться
  • 1
  • 2

Другие вопросы по меткам