В чем разница между "INNER JOIN" и "OUTER JOIN"? - PullRequest
4353 голосов
/ 02 сентября 2008

Кроме того, как вписываются LEFT JOIN, RIGHT JOIN и FULL JOIN?

Ответы [ 24 ]

51 голосов
/ 02 сентября 2010

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

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

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

FULL JOIN - комбинация LEFT OUTER JOIN и RIGHT OUTER JOIN без дублирования.

39 голосов
/ 13 апреля 2015

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

Примечание:
В SQLite нет RIGHT OUTER JOIN или FULL OUTER JOIN.
А также в MySQL нет FULL OUTER JOIN.

Мой ответ основан на выше Примечание .

Когда у вас есть две такие таблицы:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

CROSS JOIN / OUTER JOIN:
Вы можете иметь все эти данные таблиц с CROSS JOIN или просто с ,, например:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

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

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

31 голосов
/ 11 апреля 2014

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

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

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

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

25 голосов
/ 17 ноября 2013

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

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

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

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

22 голосов
/ 08 ноября 2016

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

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

Inner Join vs. Left Outer Join


enter image description here

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

20 голосов
/ 22 января 2016

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

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

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

enter image description here

19 голосов
/ 26 декабря 2017

enter image description here

  • INNER JOIN наиболее типичное объединение для двух или более таблиц. Возвращает совпадение данных как для таблицы ON primarykey, так и для отношения forignkey.
  • OUTER JOIN совпадает с INNER JOIN, но также включает в себя NULL данные ResultSet.
    • LEFT JOIN = INNER JOIN + Несоответствующие данные слева таблицы с совпадением Null в правой таблице.
    • RIGHT JOIN = INNER JOIN + Несоответствующие данные справа таблицы с Null совпадением на левой таблице.
    • FULL JOIN = INNER JOIN + Несоответствующие данные для справа и слева таблиц с Null совпадениями.
  • Self join не является ключевым словом в SQL, когда таблица ссылается на данные, которые сами по себе известны как self join. Используя INNER JOIN и OUTER JOIN, мы можем писать запросы самостоятельного объединения.

Например:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 
17 голосов
/ 28 апреля 2016

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

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

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

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

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

In-Short

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

Совпадение + Левое несоответствие = Внешнее соединение слева

Соответствует + Право не соответствует = Правое внешнее соединение

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

5 голосов
/ 13 октября 2016

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

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

2. OUTER JOIN: Возвращает набор результатов всех значений из обеих таблиц, даже если условие соответствует или нет.

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

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

5. FULL JOIN: Полное соединение и Полное внешнее соединение совпадают.

4 голосов
/ 10 июля 2017

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

Пример:

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

output1

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

Пример: * * один тысяча двадцать-одна

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

output2

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

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

joins

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

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