Яка різниця між природним з'єднанням і внутрішнім з'єднанням?
Яка різниця між природним з'єднанням і внутрішнім з'єднанням?
Відповіді:
Однією суттєвою різницею між 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 s :)
Зауважте, що SQL NATURAL JOINє еквівалентом **, однак це не обмежує корисність. Вважайте, що якби NATURAL JOINєдиний тип з'єднання підтримувався в SQL, він все ще був би відносно завершеним .
Хоча це дійсно вірно, що будь-який NATURAL JOINможе бути написаний за допомогою INNER JOINта проекції ( SELECT), але також правда, що будь-яка INNER JOINможе бути написана за допомогою product ( CROSS JOIN) та обмеження ( 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 з'єднання.)
Натуральний приєднання: це комбінований або комбінований результат усіх стовпців у двох таблицях. Він поверне всі рядки першої таблиці відносно другої таблиці.
Внутрішнє приєднання: це з'єднання буде діяти, якщо тільки будь-яке ім'я стовпця не має в двох таблицях
Natural Join - це об'єднання 2 таблиць на основі всіх загальних стовпців.
загальний стовпець: це стовпець, який має однакову назву в обох таблицях + має сумісні типи даних в обох таблицях. Ви можете використовувати лише = оператор
Внутрішня приєднання - це об'єднання двох таблиць на основі загальних стовпців, згаданих у пункті ON.
загальний стовпець: це стовпець, який має сумісні типи даних в обох таблицях, але не повинен мати однакову назву. Ви можете використовувати тільки будь-який оператор Comparision як =, <=, >=, <, >,<>
Різниця полягає в тому, що між внутрішнім (equi / за замовчуванням) приєднанням і природним приєднанням, що в natuarl приєднатися загальний стовпчик, виграш буде відображатися за один раз, але внутрішній / equi / за замовчуванням / простий приєднання, загальний стовпець буде відображатися подвійним часом.
Внутрішнє і природне з'єднання майже однакові, але між ними є незначна різниця. Різниця полягає в природному з'єднанні, не потрібно вказувати умову, але у внутрішньому стані приєднання є обов'язковим. Якщо ми вказуємо умову у внутрішньому з'єднанні, то отримані таблиці є як декартовий продукт.
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)
Внутрішнє приєднання, приєднайтеся до двох таблиць, де назва стовпця однакова.
Приєднуйтесь до природного, приєднуйтесь до двох таблиць, де назва стовпців та типи даних однакові.