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

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

4114
задан 02 сент. '08 в 1:36
источник поделиться
33 ответов
  • 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
5523
ответ дан 02 сент. '08 в 1:59
источник

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

visual explanation of joins

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

2482
ответ дан 17 мая '13 в 2:03
источник

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

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

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

Полный Outer Join:

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

593
ответ дан 30 авг. '09 в 14:52
источник

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

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

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

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

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

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

enter image description here


объяснение

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

enter link description here

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

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

enter link description here

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

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

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

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

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

Inner Join

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

enter image description here

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 Это известно как анти-соединение.

Важно выбрать столбец для теста IS NULL который либо не имеет значения 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 ОТ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ 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

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

LOJtoInner

Если бы намерение состояло в том, чтобы включать только строки из B, где Цвет Зеленый, а все строки из 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

См. Эти примеры в реальном времени на SQLFiddle.com.

545
ответ дан 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 и не добавляет дополнительных возможностей.

295
ответ дан 14 февр. '11 в 8:53
источник

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

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

Left 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 hereenter image description here

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

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 - Синтаксис соединения

Операции Oracle Join

117
ответ дан 18 дек. '14 в 9:54
источник

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

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

Ссылки

115
ответ дан 27 янв. '14 в 15:16
источник

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

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

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

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

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

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

101
ответ дан 12 янв. '13 в 14:07
источник

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

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

93
ответ дан 02 сент. '08 в 1:38
источник

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

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

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

заказы

  • Номер заказа
  • Имя покупателя

Информация для заказа

  • OrderDetailID
  • Номер заказа
  • Наименование товара
  • Кол-во
  • Цена

Запрос

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.

68
ответ дан 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

58
ответ дан 19 февр. '15 в 7:50
источник

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

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

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

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

52
ответ дан 27 сент. '12 в 10:33
источник

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

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

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

50
ответ дан 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 без дублирования.

48
ответ дан 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

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

37
ответ дан 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
ответ дан 21 янв. '17 в 20:39
источник

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

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

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

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

28
ответ дан 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?

28
ответ дан 18 сент. '13 в 5:36
источник

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

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

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

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

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

21
ответ дан 04 мая '15 в 12:09
источник

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

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

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

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

18
ответ дан 22 янв. '16 в 18:23
источник

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

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

Inner Join vs. Left Outer Join


enter image description here

Примечание: Left Join = Left Outer Join, Right Join = Right Outer Join.

16
ответ дан 08 нояб. '16 в 15:25
источник

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

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

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

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

15
ответ дан 07 сент. '15 в 13:53
источник

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

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

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

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

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

В-Short

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

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

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

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

15
ответ дан 28 апр. '16 в 12:10
источник

enter image description here

  • INNER JOIN Наиболее типичное соединение для двух или более таблиц. Он возвращает совпадение данных как по таблице ON, так и по команде forignkey.
  • OUTER JOIN - это то же самое, что и INNER JOIN, но также включает данные NULL в ResultSet.
    • LEFT JOIN= INNER JOIN + Непревзойденные данные левого стола с нулевым совпадением на правой таблице.
    • RIGHT JOIN= INNER JOIN + Непревзойденные данные правой таблицы с нулевым совпадением на левой таблице.
    • FULL JOIN= INNER JOIN + Непревзойденные данные в правой и левой таблицах с нулевыми совпадениями.
  • Самосоединение не является ключевым словом в SQL, когда таблица ссылается на данные сама по себе, знает как самостоятельное объединение. Используя 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 
12
ответ дан 26 дек. '17 в 19:49
источник

INNER JOIN

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

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

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

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

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

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

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

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

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

Заключительные замечания:

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

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

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

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

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

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

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

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

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

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

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

4
ответ дан 13 окт. '16 в 11:53
источник

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

Наиболее распространенным случаем является то, что вы сопоставляете внешний ключ одной таблицы с первичным ключом другого, например, при использовании и 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
ответ дан 11 окт. '16 в 13:50
источник
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос