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



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

815   11  

11 ответов:

одно существенное различие между внутренним соединением и естественным соединением-это количество возвращаемых столбцов.

считаем:

TableA                            TableB
Column1    Column2                Column1    Column3
1          2                      1          3

внутреннее соединение TableA и TableB на Column1 вернет

a.column1  a.column2  b.column1  b.column3
1          2          1          3

SELECT * FROM TableA INNER JOIN TableB USING (Column1)
SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1

естественное соединение TableA и TableB на Column1 вернет:

column1  column2  column3
1        2        3

SELECT * FROM TableA NATURAL JOIN TableB

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

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

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

  • An внутренний join-это тот, где соответствующая строка в Соединенной таблице требуется для возврата строки из первой таблицы
  • An внешний join-это тот, где соответствующая строка в объединенной таблице не требуется, чтобы строка из первой таблицы была возвращена
  • A естественные join-это соединение (вы можете иметь либо natural left или natural right), который предполагает, что критерии соединения должны быть там, где одноименные столбцы в обе таблицы совпадают

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

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

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

SELECT
  *
FROM
  table1
NATURAL JOIN
  table2
    USING (room_number)

это то же самое, что...

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)

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

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

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

Примечание a NATURAL JOIN является equi-join, однако это не бар для полезности. Считайте, что если NATURAL JOIN был единственным типом соединения, поддерживаемым в SQL, он все равно будет реляционно полный.

хотя это действительно правда, что любой NATURAL JOIN может быть написано с помощью INNER JOIN и проекции (SELECT), это также верно, что любой INNER JOIN может быть написано с помощью продукта (CROSS JOIN) и ограничение (WHERE); далее обратите внимание, что a 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' style
SELECT *
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

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

посмотреть equi-join раздел в Википедии:

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

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

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

удачи в кодировании.


(The NATURAL ключевое слово также может быть применен к LEFT и RIGHT соединяется, и то же самое относится. А NATURAL LEFT/RIGHT join - это просто короткий синтаксис для конкретныеLEFT/RIGHT присоединиться.)

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

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

естественное соединение - это соединение 2 таблиц на основе всех общих столбцов.

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

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

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

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

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

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

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

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)

Comments

    Ничего не найдено.