В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN? [Дубликат]

1237

Какая разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN в MySQL?

  • 1
    Объяснение Джеффа Эттвуда с диаграммами Венна может помочь вам. Визуальное объяснение соединений SQL
Показать ещё 2 комментария
Теги:
join
outer-join
inner-join

3 ответа

2665
Лучший ответ

Чтение этой оригинальной статьи в Проект кода поможет вам много: Визуальное представление соединений SQL.

Изображение 804

Также проверьте это сообщение: SQL SERVER - лучшая производительность - LEFT JOIN или NOT IN?.

Найти оригинал в: Разница между JOIN и OUTER JOIN в MySQL.

  • 180
    Эти фотографии не делают это для меня. Почему верхняя правая картинка не просто SELECT * FROM TableA; ? Почему верхний левый рисунок не просто SELECT * FROM TableB; ? Почему верхнее среднее изображение не SELECT * FROM A INTERSECT SELECT * FROM B так далее
  • 95
    У меня есть проблема со всей концепцией: это визуальные представления объединения, пересечения, за исключением и т. Д. Они не имеют визуального представления проекции, поэтому не могут быть соединениями. Я думаю, что это больше запутает, чем принесет пользу, когда контекст будет объединен.
Показать ещё 29 комментариев
563

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

LEFT JOIN получает все записи из связанной таблицы LEFT, но если вы выбрали некоторые столбцы из таблицы RIGHT, если нет связанных записей, эти столбцы будут содержать NULL

ПРАВОЕ СОЕДИНЕНИЕ похоже на приведенное выше, но получает все записи в таблице RIGHT

FULL JOIN получает все записи из обеих таблиц и помещает NULL в столбцы, где соответствующие записи не существуют в противоположной таблице

  • 13
    Технически это неверно: «INNER JOIN получает все записи из одной таблицы, в которой есть какая-то связанная запись во второй таблице» - INNER JOIN не просто возвращает записи из одной таблицы.
  • 7
    @nietaki В чем разница между "" INNER JOIN получает все записи из одной таблицы, которые имеют какую-либо связанную запись во второй таблице "" И "INNER JOIN получает все записи, которые являются общими для обеих таблиц"? Обратите внимание, что он никогда не говорил, что он просто возвращает записи из одной таблицы.
Показать ещё 3 комментария
476

Предложение SQL JOIN используется для объединения строк из двух или более таблиц на основе общего поля между ними.

В SQL доступны разные типы соединений:

INNER JOIN: возвращает строки, когда есть совпадение в обеих таблицах.

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

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

FULL JOIN: Он объединяет результаты как левого, так и правого внешних соединений.

Объединенная таблица будет содержать все записи из обеих таблиц и заполнять NULL для отсутствия совпадений с обеих сторон.

SELF JOIN: используется для объединения таблицы в себя, как если бы таблица была двумя таблицами, временно переименовывая по крайней мере одну таблицу в SQL-заявлении.

CARTESIAN JOIN: возвращает декартово произведение наборов записей из двух или более объединенных таблиц.

Мы можем взять каждый первый четыре соединения в деталях:

У нас есть две таблицы со следующими значениями.

TableA

id  firstName                  lastName
.......................................
1   arun                        prasanth                 
2   ann                         antony                   
3   sruthy                      abc                      
6   new                         abc                                           

TableB

id2 age Place
................
1   24  kerala
2   24  usa
3   25  ekm
5   24  chennai

....................................................................

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

Примечание: это дает пересечение двух таблиц, то есть строк, которые они имеют общее в TableA и TableB

Синтаксис

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

Примените его в нашей примерной таблице:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
INNER JOIN TableB
ON TableA.id = TableB.id2;

Результат будет

firstName       lastName       age  Place
..............................................
arun            prasanth        24  kerala
ann             antony          24  usa
sruthy          abc             25  ekm

ВЛЕВО

Примечание: все выделенные строки будут отображаться в таблице A, а также любые общие выбранные строки в TableB.

Синтаксис

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

Примените его в нашей примерной таблице:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
LEFT JOIN TableB
ON TableA.id = TableB.id2;

результат

firstName                   lastName                    age   Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL

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

Примечание: все выбранные строки будут отображаться в таблице Б, плюс любые общие выбранные строки в таблице.

Синтаксис

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

Примените его в нашей примерной таблице:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
RIGHT JOIN TableB
ON TableA.id = TableB.id2;

результат

firstName                   lastName                    age     Place
...............................................................................
arun                        prasanth                    24     kerala
ann                         antony                      24     usa
sruthy                      abc                         25     ekm
NULL                        NULL                        24     chennai

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

Примечание. Он вернет все выбранные значения из обеих таблиц.

Синтаксис

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

Примените его в нашей примерной таблице:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
FULL JOIN TableB
ON TableA.id = TableB.id2;

результат

firstName                   lastName                    age    Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
NULL                        NULL                        24    chennai

Интересен тот факт

Для INNER присоединяется порядок не имеет значения

Для (ВЛЕВО, ВПРАВОЕ ИЛИ ПОЛНОЕ) ВНЕШНИЕ соединения, порядок

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

  • 7
    full join - это не то же самое, что union . См stackoverflow.com/questions/905379/... и social.msdn.microsoft.com/Forums/sqlserver/en-US/...
  • 0
    Почему заказ имеет значение для ВНЕШНЕГО вступления? Вы имеете в виду производительность по отношению к оптимизаторам запросов? Набор результатов такой же.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню