Разница между естественным соединением и внутренним соединением - PullRequest
180 голосов
/ 02 января 2012

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

Ответы [ 11 ]

218 голосов
/ 02 января 2012

Одно существенное различие между INNER JOIN и NATURAL JOIN заключается в количестве возвращаемых столбцов.

Рассмотрим:

TableA                           TableB
+------------+----------+        +--------------------+    
|Column1     | Column2  |        |Column1  |  Column3 |
+-----------------------+        +--------------------+
| 1          |  2       |        | 1       |   3      |
+------------+----------+        +---------+----------+

INNER JOIN TableA и TableB в Column1 вернет

SELECT * FROM TableA INNER JOIN TableB USING (Column1);
SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1;
+------------+-----------+---------------------+    
| a.Column1  | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1          |  2        | 1        |   3      |
+------------+-----------+----------+----------+

NATURAL JOIN Таблицы A и Таблицы B в столбце 1 вернет:

SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+    
|Column1     | Column2  | Column3  |
+-----------------------+----------+
| 1          |  2       |   3      |
+------------+----------+----------+

Повторяющийся столбец исключен.

(AFAICT из стандартной грамматики, вы можетене указывайте объединяемые столбцы в естественном соединении, объединение строго основано на имени. См. также Википедия .)

( В выходных данных внутреннего объединения есть чит;Детали a. и b. не будут указаны в именах столбцов; в качестве заголовков вы бы просто указали column1, column2, column1, column3. )

78 голосов
/ 02 января 2012
  • внутреннее соединение - это соединение, в котором требуется соответствующая строка в объединенной таблице для возврата строки из первой таблицы
  • external объединение - это то, где соответствующая строка в объединенной таблице не требуется для строки из первой таблицы, которая должна быть возвращена
  • A natural объединение является объединением (у вас может быть либо natural left, либо natural right), который предполагает, что критерии объединения находятся там, где совпадают столбцы с одинаковыми именами в обеих таблицах

Я бы не использовал естественные объединения, такие как чума, потому что естественные объединенияявляются:

  • не стандартными SQL [SQL 92] и , поэтому не переносимыми, не особо читаемыми (большинством кодеров SQL) и, возможно, не поддерживаются различнымиинструменты / библиотеки
  • не информативно;Вы не можете сказать, к каким столбцам присоединяются, не обращаясь к схеме
  • ваши условия объединения незаметно уязвимы для изменений схемы - если имеется несколько столбцов естественного объединения, и один такой столбец удаляется из таблицы,запрос все еще будет выполняться, но, вероятно, не правильно, и это изменение в поведении будет молчать
  • вряд ли стоит усилий;вы экономите только около 10 секунд ввода
23 голосов
/ 02 января 2012

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

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)
13 голосов
/ 03 января 2012

SQL не верен реляционной модели во многих отношениях. Результат запроса SQL не является отношением, поскольку он может содержать столбцы с дублирующимися именами, «анонимными» (безымянными) столбцами, дублирующимися строками, нулевыми значениями и т. Д. SQL не рассматривает таблицы как отношения, поскольку полагается на порядок столбцов и т. Д.

Идея, стоящая за NATURAL JOIN в SQL, состоит в том, чтобы упростить процесс верности реляционной модели. Результат NATURAL JOIN двух таблиц будет иметь дубликаты столбцов по имени, следовательно, нет анонимных столбцов. Аналогичным образом, UNION CORRESPONDING и EXCEPT CORRESPONDING предоставляются для решения зависимости SQL от упорядочения столбцов в устаревшем синтаксисе UNION.

Однако, как и во всех методах программирования, требуется дисциплина, чтобы быть полезной. Одним из требований для успешного NATURAL JOIN является постоянное именование столбцов, поскольку объединения подразумеваются для столбцов с одинаковыми именами (обидно, что синтаксис для переименования столбцов в SQL является многословным, но побочным эффектом является поощрение дисциплины при именовании столбцов в базовые таблицы и VIEW s :)

Обратите внимание, что 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;

** Реляционное естественное соединение - не эквиджоин, это проекция одного. - philipxy

8 голосов
/ 02 января 2012

A NATURAL соединение - это просто короткий синтаксис для определенного INNER соединения - или "равное соединение" - и, когда синтаксис развернут, оба представляют одну и ту же операцию реляционной алгебры,Это не «другой тип» объединения, как в случае OUTER (LEFT / RIGHT) или CROSS объединений.

См. equi-join раздел в Википедии:

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

Большинство экспертов сходятся во мнении , что ЕСТЕСТВЕННЫЕ СОЕДИНЕНИЯ опасны и поэтому настоятельно не рекомендуют их использовать. Опасность возникает из-за непреднамеренного добавления нового столбца, названного так же, как другой столбец ...

То есть все NATURAL объединения могут быть записаны как INNER объединения (но обратное утверждение неверно).Для этого просто создайте предикат явно - например, USING или ON - и, как указал Джонатан Леффлер, выберите нужные столбцы набора результатов, чтобы избежать «дубликатов», если это необходимо.

Удачное кодирование.


(Ключевое слово NATURAL может также применяться к объединениям LEFT и RIGHT, то же самое относится. Объединение NATURAL LEFT/RIGHT простокороткий синтаксис для определенного LEFT/RIGHT соединения.)

2 голосов
/ 11 ноября 2012

Natural Join: это комбинация или объединенный результат всех столбцов в двух таблицах. Он вернет все строки первой таблицы относительно второй таблицы.

Внутреннее объединение: это объединение будет работать, если только имя столбца не будет sxame в двух таблицах

0 голосов
/ 17 октября 2017

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

0 голосов
/ 13 февраля 2017

Разница в том, что при внутреннем соединении (по умолчанию / по умолчанию) и естественном соединении, что в общем столбце соединения по соединению natuarl будет отображаться в одно время, а при внутреннем / равном / по умолчанию / простом соединении общий столбец будет отображаться дважды.

0 голосов
/ 23 июня 2015
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)

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

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)
0 голосов
/ 15 июня 2015

При естественном объединении 2 таблицы объединяются на основе всех общих столбцов.

общий столбец: это столбец с одинаковым именем в обеих таблицах + с совместимыми типами данных в обеих таблицах. Вы можете использовать только = оператор

Внутреннее объединение - это объединение двух таблиц на основе общих столбцов, упомянутых в предложении ON.

общий столбец: это столбец, который имеет совместимые типы данных в обеих таблицах, но не обязательно должен иметь одинаковое имя. Вы можете использовать только любой оператор сравнения, например =, <=, >=, <, >, <>

...