Яка різниця між природним з'єднанням і внутрішнім з'єднанням?
Яка різниця між природним з'єднанням і внутрішнім з'єднанням?
Відповіді:
Однією суттєвою різницею між 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)
Внутрішнє приєднання, приєднайтеся до двох таблиць, де назва стовпця однакова.
Приєднуйтесь до природного, приєднуйтесь до двох таблиць, де назва стовпців та типи даних однакові.