Разница между естественным соединением и внутренним соединением

В чем разница между естественным соединением и внутренним соединением?

Ответ 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

Внутреннее соединение, присоедините две таблицы, где имя столбца такое же.

Естественное объединение, присоедините две таблицы, где имена столбцов и типы данных одинаковы.