В чем разница между естественным соединением и внутренним соединением?
sql
join
natural-join
кузнец
источник
источник
Ответы:
Одно существенное различие между INNER JOIN и NATURAL JOIN заключается в количестве возвращаемых столбцов.
Рассматривать:
INNER JOIN
Из TableA и TableB на COLUMN1 вернетсяNATURAL JOIN
Из TableA и TableB на COLUMN1 вернется:Повторный столбец избегается.
(AFAICT из стандартной грамматики, вы не можете указать соединяющие столбцы в естественном соединении; объединение строго основано на имени. См. Также Википедию .)
( Там же обманщик в внутреннем соединение выхода, а
a.
иb.
части не будет в именах столбцов, вы бы простоcolumn1
,column2
,column1
, вcolumn3
качестве заголовков. )источник
NATURAL JOIN
разрушит, почему это неожиданно и в каком мире вы находитесь?Customers
иEmployees
, присоединяясь кEmployeeID
.Employees
также естьManagerID
поле. Все в порядке. Затем, однажды, кто-то добавляетManagerID
поле кCustomers
таблице. Ваше объединение не будет нарушено (это было бы милосердием), вместо этого оно теперь будет включать второе поле и работать некорректно . Таким образом, казалось бы, безобидное изменение может сломать что-то только отдаленно связанное. ОЧЕНЬ ПЛОХО. Единственным преимуществом естественного объединения является сохранение небольшого набора текста, а недостаток является существенным.SELECT * FROM TableA INNER JOIN TableB USING (Column1)
дает 4 столбца. Это не правильно, потому чтоSELECT * FROM TableA INNER JOIN TableB USING (Column1)
иSELECT * FROM TableA NATURAL JOIN TableB
равны, они оба дают 3 столбца.natural left
илиnatural right
) , что предполагает присоединиться к критериям , чтобы быть где же названием колонны в обоих матче таблицыЯ бы не использовал естественные объединения, такие как чума, потому что естественные объединения:
нестандартный sql [SQL 92] ипоэтому непереносимый, не особо читаемый (большинством кодеров SQL) и, возможно, не поддерживаемый различными инструментами / библиотекамиисточник
NATURAL JOIN Checkouts
id
вездесуще и бесполезно присоединяться; обычные имена внешних ключейtablename_id
. Естественные объединения - это плохая, плохая, плохая идея.Естественное объединение - это просто ярлык, позволяющий избежать ввода, при условии, что объединение простое и соответствует полям с одинаковыми именами.
Такой же как...
Однако то, что вы не можете сделать с форматом ярлыков, это более сложные объединения ...
источник
NATURAL JOIN ... USING ()
? Стандарт либоa NATURAL JOIN b
либоa JOIN b USING (c)
room_number
, тогда как ваши внутренние объединения будут иметь два названных столбцаroom_number
.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 такими сложными. разрабатывать.Вот несколько примеров запросов (с использованием обычной базы данных запчастей и поставщиков ), которые семантически эквивалентны:
** Реляционное естественное соединение - это не эквиджоин, а проекция единицы. - Филипп
источник
NATURAL
Присоединиться только короткий синтаксис для специфическогоINNER
присоединения - или «равностепенная присоединиться» , - и, как только синтаксис разворачивают, и представляют собой ту же самую операцию реляционной алгебры. Это не «другой вид» объединения, как в случаеOUTER
(LEFT
/RIGHT
) илиCROSS
объединений.Смотрите раздел об равном соединении в Википедии:
То есть все
NATURAL
объединения могут быть записаны какINNER
объединения (но обратное неверно). Для этого просто создайте предикат явно - например,USING
илиON
- и, как указал Джонатан Леффлер, выберите нужные столбцы набора результатов, чтобы избежать «дубликатов», если это необходимо.Удачного кодирования.
(
NATURAL
Ключевое слово также может применятьсяLEFT
иRIGHT
к объединениям, и то же самое применимо.NATURAL LEFT/RIGHT
Объединение - это всего лишь короткий синтаксис для конкретногоLEFT/RIGHT
объединения.)источник
Естественное соединение: это комбинация или объединенный результат всех столбцов в двух таблицах. Он вернет все строки первой таблицы относительно второй таблицы.
Внутреннее объединение: это объединение будет работать, если в двух таблицах не указано имя столбца sxame
источник
При естественном объединении 2 таблицы объединяются на основе всех общих столбцов.
общий столбец: это столбец с одинаковым именем в обеих таблицах + с совместимыми типами данных в обеих таблицах. Вы можете использовать только = оператор
Внутреннее объединение - это объединение двух таблиц на основе общих столбцов, упомянутых в предложении ON.
общий столбец: это столбец, который имеет совместимые типы данных в обеих таблицах, но не обязательно должен иметь одинаковое имя. Вы можете использовать только любой оператор Comparision как
=
,<=
,>=
,<
,>
,<>
источник
Разница заключается в том, что при внутреннем (equi / default) соединении и естественном соединении в общем столбце соединения natuarl win будет отображаться в одно время, а при внутреннем / equi / default / simple соединении общий столбец будет отображаться дважды.
источник
Внутреннее соединение и естественное соединение почти одинаковы, но между ними есть небольшая разница. Разница в естественном соединении - нет необходимости указывать условие, но во внутреннем соединении условие обязательно. Если мы определим условие во внутреннем соединении, то его результирующие таблицы будут похожи на декартово произведение.
источник
ВНУТРЕННЕЕ СОЕДИНЕНИЕ :
источник
Внутреннее объединение, объединение двух таблиц с одинаковыми именами столбцов.
Естественное объединение, объединение двух таблиц, где имя столбца и типы данных совпадают.
источник
NATURAL JOIN
(как несколько лет назад указывали несколько человек) - это тот, в котором имена столбцов совпадают. Тип данных не обязательно должен быть одинаковым. Поля, используемые поINNER JOIN
необходимости, не имеют одинакового имени.