В чем разница между естественным соединением и внутренним соединением?
В чем разница между естественным соединением и внутренним соединением?
Ответы:
Одно существенное различие между 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
качестве заголовков. )
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
) , что предполагает присоединиться к критериям , чтобы быть где же названием колонны в обоих матче таблицыЯ бы не использовал естественные объединения, такие как чума, потому что естественные объединения:
NATURAL JOIN Checkouts
id
вездесуще и бесполезно присоединяться; обычные имена внешних ключей tablename_id
. Естественные объединения - это плохая, плохая, плохая идея.
Естественное объединение - это просто ярлык, позволяющий избежать ввода, при условии, что объединение простое и соответствует полям с одинаковыми именами.
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)
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 такими сложными. разрабатывать.
Вот несколько примеров запросов (с использованием обычной базы данных запчастей и поставщиков ), которые семантически эквивалентны:
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;
** Реляционное естественное соединение - это не эквиджоин, а проекция единицы. - Филипп
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 соединении общий столбец будет отображаться дважды.
Внутреннее соединение и естественное соединение почти одинаковы, но между ними есть небольшая разница. Разница в естественном соединении - нет необходимости указывать условие, но во внутреннем соединении условие обязательно. Если мы определим условие во внутреннем соединении, то его результирующие таблицы будут похожи на декартово произведение.
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)
Внутреннее объединение, объединение двух таблиц с одинаковыми именами столбцов.
Естественное объединение, объединение двух таблиц, где имя столбца и типы данных совпадают.