В чем разница между естественным соединением и внутренним соединением?
Разница между естественным соединением и внутренним соединением
Ответ 1
Одним из существенных различий между INNER JOIN и NATURAL JOIN является количество возвращаемых столбцов.
Рассмотрим:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
INNER JOIN
таблиц A и TableB в столбце 1 вернется
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
NATURAL JOIN
таблиц A и TableB в столбце 1 вернется:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
Повторяющийся столбец исключается.
(AFAICT из стандартной грамматики, вы не можете указать соединяющиеся столбцы в естественном соединении; объединение строго основано на имени. См. также Википедия.)
(Там есть чит во внутреннем соединении; части a.
и b.
не будут в именах столбцов; у вас просто будут заголовки column1
, column2
, column1
, column3
].)
Ответ 2
- Внутреннее соединение - это то, где соответствующая строка в объединенной таблице требуется для возврата строки из первой таблицы.
- Внешнее соединение - это такое, в котором соответствующая строка в объединенной таблице не требуется для строки из первой таблицы, которая будет возвращена
- Естественное объединение - это объединение (вы можете иметь
natural left
илиnatural right
), которое предполагает, что критерии объединения находятся там, где совпадают столбцы с одинаковыми именами в обеих таблицах.
Я бы не использовал естественные объединения, такие как чума, потому что естественные объединения:
-
нестандартный sql [SQL 92] ипоэтому непереносимый, не особо читаемый (большинством кодеров SQL) и, возможно, не поддерживаемый различными инструментами/библиотеками - неинформативно; Вы не можете сказать, к каким столбцам присоединяются, не обращаясь к схеме
- Ваши условия соединения незаметно уязвимы для изменений схемы - если имеется несколько столбцов естественного объединения и один такой столбец удален из таблицы, запрос все равно будет выполнен, но, вероятно, не правильно, и это изменение в поведении будет молчать
- вряд ли стоит усилий; вы экономите только около 10 секунд ввода
Ответ 3
Естественное объединение - это просто ярлык, позволяющий избежать ввода, при условии, что объединение простое и соответствует полям с одинаковыми именами.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses 'room_number' to join
Такой же как...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Однако то, что вы не можете сделать с форматом ярлыков, это более сложные объединения...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
Ответ 4
SQL не верен реляционной модели во многих отношениях. Результат запроса SQL не является отношением, поскольку он может содержать столбцы с дублирующимися именами, "анонимными" (безымянными) столбцами, дублирующимися строками, нулевыми значениями и т.д. SQL не рассматривает таблицы как отношения, поскольку полагается на порядок столбцов и т.д.
Идея NATURAL JOIN
в SQL состоит в том, чтобы упростить процесс верности реляционной модели. Результат NATURAL JOIN
двух таблиц будет иметь дубликаты столбцов по имени, следовательно, нет анонимных столбцов. Аналогично, UNION CORRESPONDING
и EXCEPT CORRESPONDING
предоставляются для устранения зависимости SQL от упорядочения столбцов в устаревшем синтаксисе UNION
.
Однако, как и во всех методах программирования, требуется дисциплина, чтобы быть полезной. Одним из требований успешного NATURAL JOIN
является постоянное именование столбцов, поскольку объединения подразумеваются для столбцов с одинаковыми именами (обидно, что синтаксис для переименования столбцов в SQL является многословным, но побочным эффектом является поощрение дисциплины при именовании столбцов в базе данных). таблицы и VIEW
:)
Обратите внимание, что SQL NATURAL JOIN
является равноправным соединением **, однако это не является препятствием для полезности. Учтите, что если бы NATURAL JOIN
был единственным типом соединения, поддерживаемым в SQL, он все равно был бы завершен по отношению.
Хотя действительно верно, что любое NATURAL JOIN
может быть написано с использованием INNER JOIN
и проекции (SELECT
), также верно, что любое INNER JOIN
может быть написано с использованием продукта (CROSS JOIN
) и ограничения (WHERE
); далее отметим, что NATURAL JOIN
между таблицами без общих имен столбцов даст тот же результат, что и CROSS JOIN
. Поэтому, если вас интересуют только результаты, которые являются отношениями (а почему нет?!), тогда NATURAL JOIN
- единственный тип соединения, который вам нужен. Конечно, это правда, что с точки зрения языкового дизайна такие сокращения, как INNER JOIN
и CROSS JOIN
имеют свою ценность, но также учитывают, что почти любой SQL-запрос может быть написан 10 синтаксически различными, но семантически эквивалентными способами, и именно это делает SQL оптимизаторы очень сложно разрабатывать.
Вот несколько примеров запросов (использующих обычные базы данных запчастей и поставщиков), которые семантически эквивалентны:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** Реляционное естественное соединение - это не эквиджоин, а проекция одного. - Филипп
Ответ 5
A NATURAL
join - это просто короткий синтаксис для конкретного объединения INNER
- или "equi-join" - и, как только синтаксис разворачивается, обе представляют собой одну и ту же операцию реляционной алгебры. Это не "разный вид" соединения, как в случае с OUTER
(LEFT
/RIGHT
) или CROSS
.
Смотрите раздел equi-join в Википедии:
Естественное соединение предлагает дополнительную специализацию equi-joins. Предикат соединения возникает неявно, сравнивая все столбцы в обеих таблицах, которые имеют одинаковые имена столбцов в связанных таблицах. Полученная объединенная таблица содержит только один столбец для каждой пары одинаково названных столбцов.
Большинство экспертов согласны с тем, что NATURAL JOINs опасны и, следовательно, сильно препятствуют их использованию. Опасность возникает из-за непреднамеренного добавления нового столбца, названного так же, как и другой столбец...
То есть все объединения NATURAL
могут быть записаны как INNER
join (но обратное неверно). Для этого просто создайте предикат в явном виде - например. USING
или ON
- и, как указал Джонатан Леффлер, выберите желаемые столбцы с результатами, чтобы избежать "дубликатов", если это необходимо.
Счастливое кодирование.
(Ключевое слово NATURAL
также может применяться к объединениям LEFT
и RIGHT
, и то же самое относится. Соединение NATURAL LEFT/RIGHT
- это просто короткий синтаксис для конкретного объединения LEFT/RIGHT
.)
Ответ 6
Natural Join: это комбинированный или комбинированный результат всех столбцов в двух таблицах. Он вернет все строки первой таблицы относительно второй таблицы.
Inner Join: это соединение будет работать, если только любое имя столбца не должно быть sxame в двух таблицах
Ответ 7
A Natural Join - это то, где две таблицы объединены на основе всех общих столбцов.
общий столбец: это столбец с одинаковым именем в обеих таблицах + имеет совместимые типы данных в обеих таблицах. Вы можете использовать только = operator
A Inner Join - это место, где две таблицы объединены на основе общих столбцов, упомянутых в предложении ON.
общий столбец: это столбец, который имеет совместимые типы данных в обеих таблицах, но не должен иметь одинаковое имя.
Вы можете использовать только любой оператор сравнения, например =
, <=
, >=
, <
, >
, <>
Ответ 8
разница заключается в том, что int внутреннее (equi/default) соединение и естественное соединение, которое в общем вызове natuarl join будет отображаться за один раз, но inner/equi/default/simple join, общий столбец будет отображаться дважды.
Ответ 9
Внутреннее соединение и естественное соединение почти одинаковы, но между ними существует небольшая разница. Разница в естественном соединении не требует указания условия, но условие внутреннего соединения является обязательным. Если мы укажем условие во внутреннем соединении, то результирующие таблицы будут выглядеть как декартово.
Ответ 10
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
INNER JOIN:
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
Ответ 11
Внутреннее соединение, присоедините две таблицы, где имя столбца такое же.
Естественное объединение, присоедините две таблицы, где имена столбцов и типы данных одинаковы.