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 является подробным, но побочным эффектом является поощрение дисциплина при именовании столбцов в базовых таблицах иVIEWs:)Примечание a
NATURAL JOINявляется equi-join, однако это не бар для полезности. Считайте, что еслиNATURAL JOINбыл единственным типом соединения, поддерживаемым в SQL, он все равно будет реляционно полный.хотя это действительно правда, что любой
NATURAL JOINможет быть написано с помощьюINNER JOINи проекции (SELECT), это также верно, что любойINNER JOINможет быть написано с помощью продукта (CROSS JOIN) и ограничение (WHERE); далее обратите внимание, что aNATURAL 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
NATURALjoin - это просто короткий синтаксис для конкретныеINNERjoin -- или "equi-join" -- и, как только синтаксис развернут, оба представляют одну и ту же операцию реляционной алгебры. Это не "другой вид" соединения, как в случаеOUTER(LEFT/RIGHT) илиCROSSприсоединяется.посмотреть equi-join раздел в Википедии:
естественное соединение предлагает дополнительную специализацию equi-соединений. присоединиться предикат возникает неявно путем сравнения всех столбцов в обеих таблицах которые имеют одинаковые имена столбцов в соединяемых таблицах. результирующая объединенная таблица содержит только один столбец для каждой пары столбцов с одинаковыми именами.
большинство экспертов сходятся во мнении что естественные соединения опасны и поэтому сильно препятствуют их использованию. опасность исходит от непреднамеренного добавления нового столбца, названного так же, как и другой столбец ...
то есть все
NATURALсоединения могут быть записаны какINNERсоединения (но не наоборот). Для этого просто создайте предикат явно -- например,USINGилиON-- и, как указал Джонатан Леффлер, выберите нужные столбцы результирующего набора, чтобы избежать "дубликатов", если это необходимо.удачи в кодировании.
(The
NATURALключевое слово также может быть применен кLEFTиRIGHTсоединяется, и то же самое относится. АNATURAL LEFT/RIGHTjoin - это просто короткий синтаксис для конкретные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