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


197

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


3
Этот вопрос не является дубликатом другого, поскольку речь идет о ВНУТРЕННИХ или ЕСТЕСТВЕННЫХ объединениях, которые не рассматриваются в другом.

1
Когда-то это было закрыто как дубликат В чем разница между левым, правым, внешним и внутренним объединениями , но этот вопрос не касается различия между внутренними объединениями и естественными объединениями.
Джонатан Леффлер

Ответы:


250

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

Рассматривать:

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

INNER JOINИз TableA и TableB на COLUMN1 вернется

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Из TableA и TableB на COLUMN1 вернется:

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

Повторный столбец избегается.

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

( Там же обманщик в внутреннем соединение выхода, а a.и b.части не будет в именах столбцов, вы бы просто column1, column2, column1, в column3качестве заголовков. )


2
У меня есть две таблицы TableA (Column1, Column2) и TableB (Column2, Column3).
2 8

16
Свертывание столбцов в выходных данных является наименее важным аспектом естественного объединения. Вещи, которые вам нужно знать: (A) он автоматически включается в поля с одинаковыми именами и (B) он увеличивает ваши ***, когда вы меньше всего этого ожидаете. В моем мире использование естественного соединения является основанием для увольнения.

8
@JonofAllTrades Можете ли вы объяснить больше о том, что именно NATURAL JOINразрушит, почему это неожиданно и в каком мире вы находитесь?
Брайсон

35
Это несколько решено в ответе пользователя 166390. Скажем, у вас есть естественное соединение между Customersи Employees, присоединяясь к EmployeeID. Employeesтакже есть ManagerIDполе. Все в порядке. Затем, однажды, кто-то добавляет ManagerIDполе к Customersтаблице. Ваше объединение не будет нарушено (это было бы милосердием), вместо этого оно теперь будет включать второе поле и работать некорректно . Таким образом, казалось бы, безобидное изменение может сломать что-то только отдаленно связанное. ОЧЕНЬ ПЛОХО. Единственным преимуществом естественного объединения является сохранение небольшого набора текста, а недостаток является существенным.

2
@Jonathan, Что касается вашего ответа, вы заявили, что SELECT * FROM TableA INNER JOIN TableB USING (Column1)дает 4 столбца. Это не правильно, потому что SELECT * FROM TableA INNER JOIN TableB USING (Column1)и SELECT * FROM TableA NATURAL JOIN TableBравны, они оба дают 3 столбца.
Pacerier

81
  • Внутреннее соединение является тот , где соответствующая строка в объединенной таблице требуется для строки из первой таблицы должны быть возвращены
  • Внешнее соединение является тот , где соответствующая строка в таблице присоединился не требуется для строки из первой таблицы должны быть возвращены
  • Естественное соединение является объединение (вы можете иметь либо natural leftили natural right) , что предполагает присоединиться к критериям , чтобы быть где же названием колонны в обоих матче таблицы

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

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

2
Я думаю, что левое / правое для внешнего должно быть упомянуто (поскольку внешнее упомянуто вообще). Но в остальном, красиво и кратко: в нем отсутствуют только красивые примеры диаграмм записей SQL.

2
ЕСТЕСТВЕННЫЙ ЛЕВЫЙ и ЕСТЕСТВЕННОЕ ПРАВО также существуют. Но да, все равно избегайте их.
MatBailie

1
@ Bohemian, Что касается "избегать их, как чумы", существуют реальные варианты использования для естественных объединений, в результате чего они пригодятся. mariadb.com/kb/en/sql-99/natural-join "... NATURAL JOIN Checkouts
Pacerier

2
@sqlvovel в вашем комментарии много неправильного, в частности, оно неправильное. Столбцы объединения не могут быть «указаны в списке выбора». Определение естественного объединения состоит в том, чтобы объединить * все одноименные столбцы *. Из документа MySQL: NATURAL [LEFT] JOIN двух таблиц определен как семантически эквивалентный INNER JOIN или LEFT JOIN с предложением USING, в котором перечислены все столбцы, существующие в обеих таблицах. , И еще одна вещь - на практике это бесполезно, потому что idвездесуще и бесполезно присоединяться; обычные имена внешних ключей tablename_id. Естественные объединения - это плохая, плохая, плохая идея.
Богемный

2
В моем запросе нет двойных возвращаемых столбцов. Одним из преимуществ семантики NJ является то, что дублированные столбцы никогда не возвращаются. Ваш предыдущий запрос также был «менее безопасным», чем мой, потому что он потерпел бы неудачу, если бы столбец с именем «a» был добавлен в t2 (поскольку условие соединения без псевдонимов неоднозначно). Я подозреваю, что ваши предубеждения против NJ основаны на том факте, что вы не пробовали его в продукте, в котором стандарт SQL поддерживается должным образом. Вопрос здесь о SQL, а не MySQL - совершенно разные вещи. Вы все еще не исправили свой ответ о его нестандартности.
nvogel

27

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

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)

2
@JonathanLeffler - в MySQL, конечно.
MatBailie

3
ОК - интересно. Я спросил, потому что стандарт SQL, похоже, не позволяет этого (но расширения всегда возможны).
Джонатан Леффлер

Какой СУБД позволяет этот нестандартный синтаксис: NATURAL JOIN ... USING ()? Стандарт либо a NATURAL JOIN bлибоa JOIN b USING (c)
ypercubeᵀᴹ

1
«просто ярлык, чтобы избежать ввода» - это искажение. Самая важная особенность заключается в том, что это не приводит к дублированию столбцов.
1

... например, результат вашего запроса, который использует естественное соединение, будет иметь только один названный столбец room_number, тогда как ваши внутренние объединения будут иметь два названных столбца room_number.
понедельник,

13

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и projection ( SELECT), также верно, что любое INNER JOINможет быть написано с использованием product ( CROSS JOIN) и limit ( 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;

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


Реляционное естественное соединение - не эквиджоин, а проекция одного. Естественное соединение SQL - это эквивалент SQL (возможны дубликаты) - оно определяется с точки зрения использования внутреннего соединения.
Филипп

@philipxy: Спасибо, я внес поправки. Пожалуйста, не стесняйтесь редактировать - этот или любой из моих ответов - для искажений и недоразумений. Я все еще учусь у вас :)
понедельник,

9

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

Смотрите раздел об равном соединении в Википедии:

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

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

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

Удачного кодирования.


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


2
«НАТУРАЛЬНОЕ объединение - это всего лишь короткий синтаксис для [отрезанного]« равного соединения »- и, когда синтаксис развернут, оба представляют одну и ту же реляционную алгебру» - вы правы: это верно для реляционной алгебры, но ваш ответ разбивается после этого, например, «Большинство экспертов сходятся во мнении, что ЕСТЕСТВЕННЫЕ СОЕДИНЕНИЯ опасны и поэтому настоятельно не рекомендуют их использовать» - какие эксперты по реляционной алгебре говорят, что ?!
1

2

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

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


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

0

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

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

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

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


-2

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


-2

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


Почему нет необходимости указывать условия соединения? При каких обстоятельствах указание условий во внутреннем соединении приведет к чему-то похожему на декартово произведение?
понедельник,

Называть внешнее и внутреннее соединение "почти одинаково" - это немного преуменьшать. Может быть, вы можете уточнить вашу оценку?
TMOTTM

-3
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)

-4

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

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


Это совершенно неверно. A NATURAL JOIN(как несколько лет назад указывали несколько человек) - это тот, в котором имена столбцов совпадают. Тип данных не обязательно должен быть одинаковым. Поля, используемые по INNER JOINнеобходимости, не имеют одинакового имени.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.