В чем разница между "INNER JOIN" и "OUTER JOIN"?
Также как LEFT JOIN
, RIGHT JOIN
и FULL JOIN
вписываются?
Ответы
Ответ 1
Предполагая, что вы присоединяетесь к столбцам без дубликатов, что является очень распространенным случаем:
-
Внутреннее объединение 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
Ответ 2
Также вы можете рассмотреть следующую схему для разных типов соединений:
Источник: Visual-Representation-of-SQL-Joins подробно объясняется C.L. Моффат
Ответ 3
Я рекомендую статью блога Джеффа. Лучшее описание, которое я когда-либо видел, плюс визуализация, например:
Внутренняя регистрация:
Полный Outer Join:
Ответ 4
Диаграммы Венна на самом деле не делают этого для меня.
Например, они не показывают какого-либо различия между перекрестным соединением и внутренним соединением или, как правило, показывают какое-либо различие между различными типами предикатов соединения или обеспечивают основу для рассуждений о том, как они будут работать.
Нет никакой альтернативы пониманию логической обработки, и это довольно просто понять.
- Представьте себе крест.
- Оцените предложение
on
по всем строкам с шага 1, сохраняя те, где предикат оценивает значение true
- (Только для внешних соединений) добавьте обратно в любые внешние строки, которые были потеряны на шаге 2.
(NB: На практике оптимизатор запросов может найти более эффективные способы выполнения запроса, чем чисто логическое описание выше, но конечный результат должен быть одинаковым)
Я начну с анимированной версии полного внешнего соединения. Дальнейшее объяснение следует.
объяснение
Исходные таблицы
Сначала начните с CROSS JOIN
(Carteian Product). Это не имеет предложения ON
и просто возвращает каждую комбинацию строк из двух таблиц.
SELECT A.Colour, B.Colour FROM A CROSS JOIN B
Внутренние и внешние соединения имеют предикат предложения ON.
- Внутреннее соединение. Оцените условие в предложении "ON" для всех строк в результате перекрестного соединения. Если true, верните объединенную строку. В противном случае отбросьте его.
- Left Outer Join. То же, что и внутреннее соединение, то для любых строк в левой таблице, которые не соответствуют чему-либо, выводят их с NULL-значениями для столбцов правой таблицы.
- Правое внешнее соединение. То же, что и внутреннее соединение, то для любых строк в правой таблице, которые не соответствуют чему-либо, выводят их с значениями NULL для столбцов левой таблицы.
- Полное внешнее соединение. То же, что и внутреннее соединение, тогда сохраняйте левые несопоставимые строки, как в левом внешнем соединении, так и в правых не совпадающих строках в соответствии с правым внешним соединением.
Некоторые примеры
SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour = B.Colour
Вышеприведенное классическое объединение equi.
Анимированная версия
SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN ("Зеленый", "Синий")
Внутреннее условие соединения необязательно должно быть условием равенства, и ему не нужно ссылаться на столбцы из (или даже любой) таблиц. Оценка A.Colour NOT IN ('Green','Blue')
в каждой строке перекрестного соединения возвращается.
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
для правые столбцы.
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
для этого столбца в дополнение к несогласованным строкам.
SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour
Правые внешние соединения действуют аналогично левым внешним соединениям, за исключением того, что они сохраняют несоответствующие строки из правой таблицы, а null расширяют левые столбцы.
SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour
Полное внешнее объединение объединяет поведение левого и правого объединений и сохраняет несоответствующие строки как из левой, так и из правой таблиц.
SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0
Никакие строки в перекрестном соединении не соответствуют предикату 1=0
. Все строки с обеих сторон сохраняются с использованием обычных правил внешнего соединения с NULL в столбцах из таблицы с другой стороны.
SELECT COALESCE (A.Colour, B.Colour) AS Color ОТ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ON 1 = 0
При незначительной поправке к предыдущему запросу можно смоделировать UNION ALL
из двух таблиц.
SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'
Обратите внимание, что WHERE
(если присутствует) логически запускается после соединения. Одной из распространенных ошибок является выполнение левого внешнего соединения, а затем включение предложения WHERE с условием в правой таблице, которое заканчивается исключением несоответствующих строк. Вышеприведенное завершает выполнение внешнего соединения...
... И затем выполняется предложение "Где". NULL= 'Green'
не оценивает значение true, поэтому строка, сохраненная внешним соединением, заканчивается отбрасыванием (вместе с синим), эффективно преобразуя соединение обратно во внутреннее.
Если бы намерение состояло в том, чтобы включать только строки из B, где Цвет Зеленый, а все строки из A, независимо от правильного синтаксиса,
SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour AND B.Colour = 'Green'
SQL Fiddle
См. Эти примеры в реальном времени на SQLFiddle.com.
Ответ 5
Из статьи "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 и не добавляет дополнительных возможностей.
Ответ 6
Соединения используются для объединения данных из двух таблиц, в результате чего создается новая временная таблица. Соединения выполняются на основе чего-то, называемого предикатом, который определяет условие для использования для соединения. Разница между внутренним соединением и внешним соединением заключается в том, что внутреннее соединение будет возвращать только строки, которые фактически соответствуют на основе предиката соединения. Рассмотрим таблицу Employee and Location:
Внутреннее соединение: - Внутреннее соединение создает новую таблицу результатов путем объединения значений столбцов двух таблиц (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:
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 будет выглядеть так:
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
Используя приведенные выше таблицы, мы можем показать, как будет выглядеть результирующий набор правого внешнего соединения:
Полное Внешнее Объединение: - Полное Внешнее Присоединение или Полное Присоединение - сохранить информацию о немаркировке, включив нечетные строки в результаты соединения, используйте полное внешнее соединение. Он включает все строки из обеих таблиц, независимо от того, имеет ли другая таблица соответствующее значение.
Источник изображения
Справочное руководство по MySQL 8.0 - Синтаксис соединения
Операции Oracle Join
Ответ 7
Внутреннее соединение
Получить только сопоставленные строки, то есть A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Левое внешнее соединение
Выберите все записи из первой таблицы и любые записи во второй
таблицу, соответствующую совпадающим клавишам.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Полное внешнее соединение
Выберите все записи из второй таблицы и любые записи в первой
таблицу, соответствующую совпадающим клавишам.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Ссылки
Ответ 8
Простыми словами:
внутреннее соединение извлекает только согласованные строки.
В то время как внешнее соединение извлекает согласованные строки из одной таблицы и всех строк в другой таблице... результат зависит от того, какой из них вы используете:
-
Слева: совпадающие строки в правой таблице и все строки в левой таблице
-
Правильно. Соответствующие строки в левой таблице и все строки в правой таблице или
-
Полный: все строки во всех таблицах. Не имеет значения, есть ли совпадение или нет.
Ответ 9
Внутреннее соединение показывает только строки, если на другой (правой) стороне соединения есть соответствующая запись.
A (слева) внешнее соединение показывает строки для каждой записи в левой части, даже если на другой (правой) стороне соединения нет соответствующих строк. Если нет соответствующей строки, столбцы для другой (правой) стороны отображают NULL.
Ответ 10
Внутренние соединения требуют, чтобы в объединенной таблице существовала запись с соответствующим идентификатором.
Внешние соединения возвращают записи для левой стороны, даже если ничего не существует для правой стороны.
Например, у вас есть таблица Заказы и 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
.
Ответ 11
Простыми словами:
Внутреннее соединение → Принимать ТОЛЬКО общие записи из родительских и дочерних таблиц. ГДЕ первичный ключ родительской таблицы соответствует внешнему ключу в таблице "Дети".
Левое соединение →
псевдокод
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 в результате объединения.
Пример:
Предположим теперь, что для 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;
Диаграмматически это выглядит так:
Ответ 12
Вы используете INNER JOIN
, чтобы возвращать все строки из обеих таблиц, где есть совпадение. т.е. в итоговой таблице все строки и столбцы будут иметь значения.
В OUTER JOIN
итоговая таблица может содержать пустые столбцы. Внешнее соединение может быть либо LEFT
, либо RIGHT
.
LEFT OUTER JOIN
возвращает все строки из первой таблицы, даже если во второй таблице нет совпадений.
RIGHT OUTER JOIN
возвращает все строки из второй таблицы, даже если совпадений нет в первой таблице.
Ответ 13
Это хорошее диаграммное объяснение для всех типов объединений
источник: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
Ответ 14
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
без дублирования.
Ответ 15
Ответ заключается в значении каждого из них, поэтому в результатах.
Примечание:
В 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
Ну, по мере необходимости, вы выбираете каждый, который покрывает ваши потребности;).
Ответ 16
В SQL A join используется для сравнения и объединения - буквально join - и возвращает определенные строки данных из двух или более таблиц в базе данных. внутреннее соединение находит и возвращает соответствующие данные из таблиц, а внешнее соединение находит и возвращает соответствующие данные и некоторые несходные данные из таблиц.
Внутренняя регистрация
внутреннее соединение фокусируется на общности между двумя таблицами. При использовании внутреннего соединения должны быть, по крайней мере, некоторые совпадающие данные между двумя (или более) таблицами, которые сравниваются. внутреннее соединение ищет таблицы для сопоставления или перекрытия данных. При обнаружении этого, внутреннее соединение объединяет и возвращает информацию в одну новую таблицу.
Пример внутреннего подключения
Рассмотрим общий сценарий двух таблиц: цены и количества продуктов. Общая информация в двух таблицах - это имя продукта, так что это логический столбец присоединиться к таблицам. Есть несколько продуктов, которые являются общими в двух таблицах; другие уникальны для одной из таблиц и не имеют соответствия в другой таблице.
внутреннее соединение на продуктах возвращает информацию только о тех продуктах, которые являются общими в обеих таблицах.
Внешняя связь
An external join возвращает набор записей (или строк), которые включают в себя возвращение внутреннего соединения, а также другие строки, для которых не найдено соответствующего соответствия другую таблицу.
Существует три типа внешних соединений:
- Left Outer Join (или Left Join)
- Right Outer Join (или Right Join)
- Полное внешнее соединение (или полное соединение)
Каждое из этих внешних соединений относится к части данных, которые сравниваются, объединяются и возвращаются. Иногда в этом процессе создаются нули, поскольку некоторые данные совместно используются, а другие данные не являются.
Левое внешнее соединение
A левое внешнее соединение вернет все данные в таблице 1 и все общие данные (так, внутренняя часть диаграммы диаграммы Венна), но только соответствующие данные из таблицы 2, которая правое соединение .
Пример левого соединения
В моей базе данных примеров есть два продукта - апельсины и помидоры - в левой части (таблица цен), которые не имеют соответствующей записи в правой колонке (таблица количества). В левом соединении эти строки включаются в набор результатов с NULL в столбце Количество. Остальные строки в результате совпадают с внутренним соединением .
Right Outer Join
A правое внешнее соединение возвращает данные таблицы 2 и все общие данные, но только соответствующие данные из таблицы 1, которые являются левым соединением.
Пример правого соединения
Как и в примере left join, вывод правого внешнего соединения включает в себя все строки внутреннего соединения и двух строк - брокколи и squash - из "правой" (таблица количества), которые не имеют соответствующих записей слева.
Полная внешняя подписка
A полное внешнее соединение или полное соединение, которое не поддерживается популярной системой управления базами данных MySQL, объединяет и возвращает все данные из двух или более таблиц независимо от того, существует ли общая информация. Подумайте о full join как о простом дублировании всей указанной информации, но в одной таблице, а не в нескольких таблицах. Если отсутствуют совпадающие данные, будут выданы нули.
Ответ 17
Внутреннее соединение.
Соединение объединяет строки из двух таблиц. Внутреннее соединение пытается сопоставить две таблицы на основе критериев, заданных в запросе, и возвращает только строки, которые соответствуют. Если строка из первой таблицы в соединении совпадает с двумя строками во второй таблице, в результатах будут возвращены две строки. Если theres строка в первой таблице, которая не соответствует строке во второй, ее не возвращают; Аналогично, если theres строка во второй таблице, которая не соответствует строке в первом, ее не возвращают.
Внешняя связь.
В результате попыток левого соединения найти совпадение строк из первой таблицы со строками во второй таблице. Если он не сможет найти совпадение, он вернет столбцы из первой таблицы и оставит столбцы со второй таблицы пустым (null).
Ответ 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?
Ответ 19
В других ответах я не вижу подробностей о производительности и оптимизаторе.
Иногда полезно знать, что только INNER JOIN
является ассоциативным, что означает, что оптимизатор имеет наибольшую возможность играть с ним. Он может изменить порядок заказа на соединение, чтобы сделать его более быстрым, сохраняя тот же результат. Оптимизатор может использовать большинство режимов соединения.
Как правило, рекомендуется использовать INNER JOIN
вместо разных типов соединений. (Конечно, если это возможно, учитывая ожидаемый набор результатов.)
В этом странном ассоциативном поведении есть несколько хороших примеров и объяснений:
Ответ 20
Точный алгоритм для INNER JOIN
, LEFT/RIGHT OUTER JOIN
:
- Возьмите каждую строку из первой таблицы:
a
- Рассмотрим все строки из второй таблицы рядом с ней:
(a, b[i])
- Оцените предложение
ON...
каждой пары: ON( a, b[i] ) = true/false?
- Когда условие оценивается как
true
, вернуть эту объединенную строку (a, b[i])
. - Когда достигается конец второй таблицы без какого-либо соответствия, и это
Outer Join
тогда возвращают (виртуальную) пару, используя Null
для всех столбцов другой таблицы: (a, Null)
для LEFT внешнего соединения или (Null, b)
для RIGHT внешнего присоединиться. Это делается для того, чтобы все строки первой таблицы существовали в конечных результатах.
Примечание: условие, указанное в предложении ON
, может быть любым, необязательно использовать первичные ключи (и вам не нужно всегда ссылаться на столбцы из обеих таблиц)! Например:
Примечание: левое соединение = левое внешнее соединение, правое соединение = правое внешнее соединение.
Ответ 21
Разница заключается в том, как таблицы объединяются, если нет общих записей.
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
, то есть отображает все записи из второй (правой) таблицы и только соответствующие записи из первой (левой) таблицы.
Ответ 22
Критикуя очень любимую красноватую диаграмму Венна, я подумал, что это справедливо, чтобы опубликовать мою собственную попытку.
Несмотря на то, что ответ @Martin Smith - лучший из этой группы, он показывает только столбец ключей из каждой таблицы, тогда как я думаю, что в идеале должны быть показаны нек-ликовые столбцы.
Лучшее, что я мог сделать за полчаса, я все же не думаю, что он адекватно показывает, что нули есть из-за отсутствия ключевых значений в TableB
или что OUTER JOIN
на самом деле является объединением, а не присоединиться:
Ответ 23
Простейшие определения
Inner Join: возвращает сопоставленные записи из обеих таблиц.
Full Outer Join: возвращает сопоставленные и несвязанные записи из обеих таблиц с нулевым значением для несравнимых записей из Обе таблицы.
Left Outer Join: возвращает совпадающие и несогласованные записи только из таблицы Левая сторона.
Right Outer Join: возвращает совпадающие и несогласованные записи только из таблицы с правой стороны.
В-Short
Совпадение + Слева Непревзойденное + Правое Непревзойденное = Полное внешнее соединение
Совпадение + Левое Непревзойденное = Левое внешнее соединение
Совпадает + Прямо Непревзойденное = Прямое внешнее соединение
Согласовано = Внутреннее соединение
Ответ 24
-
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
совпадениями.
- Самосоединение не является ключевым словом в 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
Ответ 25
Внутренняя регистрация
Внутреннее соединение фокусируется на общности между двумя таблицами. При использовании внутреннего соединения должны быть по крайней мере некоторые совпадающие данные между двумя (или более) таблицами, которые сравниваются. Внутреннее соединение ищет таблицы для сопоставления или перекрытия данных. После его нахождения внутреннее соединение объединяет и возвращает информацию в одну новую таблицу.
Outer Join
Внешнее объединение возвращает набор записей (или строк), которые включают в себя то, что будет возвращено внутренним соединением, а также другие строки, для которых не найдено соответствующего соответствия в другой таблице.
Существует три типа внешних соединений:
Левая внешняя связь (или левая регистрация)
Правое внешнее соединение (или правое соединение)
Полная внешняя регистрация (или полная регистрация)
Каждое из этих внешних соединений относится к части данных, которые сравниваются, объединяются и возвращаются. Иногда в этом процессе создаются нули, поскольку некоторые данные совместно используются, а другие данные не являются.
Ответ 26
INNER JOIN
Внутреннее соединение создает набор результатов, который ограничен строками, в которых есть совпадение в обеих таблицах для того, что мы ищем. Если вы не знаете, какое соединение вам нужно, это, как правило, будет вашим лучшим выбором.
ВЛЕВОЕ ВЗАИМОДЕЙСТВИЕ
Левое внешнее соединение или левое соединение приводит к набору, в котором сохраняются все строки из первой или левой стороны таблицы. Строки со второй или правой стороны таблицы отображаются только в том случае, если они совпадают с строками из первой таблицы. Если в левой таблице есть значения, но не справа, таблица будет считаться нулевой, что означает, что значение не было установлено.
ПРАВОЙ ВНЕШНИЙ ВХОД
Прямое внешнее соединение или правое соединение - это то же самое, что и левое соединение, за исключением того, что роли меняются на противоположные. Все строки из правой стороны таблицы отображаются в результатах, но строки из таблицы слева находятся только там, если они соответствуют таблице справа. Пустые пространства равны нулю, как и левое соединение.
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
Полное внешнее соединение или просто внешнее соединение создает набор результатов со всеми строками обеих таблиц, независимо от того, имеются ли какие-либо совпадения. Аналогично левому и правому объединению мы называем пустые пространства нулями.
Для более Ссылка
Ответ 27
В чем разница между "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
.
Ответ 28
В простых условиях
1. INNER JOIN или EQUI JOIN: Возвращает набор результатов, который соответствует только условию в обеих таблицах.
2. ВНЕШНЯЯ СЕТЬ: Возвращает набор результатов всех значений из обеих таблиц, даже если есть условие соответствия или нет.
3. LEFT JOIN: Возвращает набор результатов всех значений из левой таблицы и только строки, соответствующие условию в правой таблице.
4. RIGHT JOIN: Возвращает набор результатов всех значений из правой таблицы и только строки, соответствующие условию в левой таблице.
5. ПОЛНОЕ СОЕДИНЕНИЕ: Полное соединение и полное внешнее соединение одинаковы.
Ответ 29
1. Внутренняя регистрация: Также называется Join. Он возвращает строки, присутствующие как в левой таблице, так и в правой таблице, только , если есть соответствие. В противном случае он возвращает нулевые записи.
Пример:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
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
3. Левое внешнее соединение: Или просто называется Left Join. Он возвращает все строки, присутствующие в левой таблице, и соответствующие строки из правой таблицы (если они есть).
4. Right Outer Join: Также называется Right Join. Он возвращает совпадающие строки из левой таблицы (если они есть) и всех строк, присутствующих в правой таблице.
Преимущества объединений
Ответ 30
-
Внутреннее соединение. внутреннее соединение с использованием любого из эквивалентных запросов дает пересечение двух таблиц, то есть двух строк, которые они имеют вместе.
-
Левое внешнее соединение - A left external join даст все строки в плюс любые общие строки в B.
-
Полное внешнее соединение. полное внешнее соединение даст вам объединение A и B, т.е. все строки в и все строки из B. Если что-то в не имеет соответствующей привязки в B, то часть B имеет значение NULL и наоборот.