Питання Яка різниця між "INNER JOIN" та "OUTER JOIN"?


Також, як це зробити LEFT JOIN, RIGHT JOIN і FULL JOIN вписатися?


4018
2017-09-01 22:36


походження


З наведених тут відповідей та коментарів та їх посилань тільки один насправді пояснює, як діаграми Венна представляють операторів: область перетину окружності представляє собою набір рядків у A JOIN B. Область, унікальна для кожного кола, являє собою набір рядків, який ви отримуєте, беручи рядки таблиці, які не беруть участь в A JOIN B і додавання колонок, унікальних для іншої таблиці, встановлено як NULL. (І більшість дають туманне фальшиве листування кола до А і В.) - philipxy
Багато відповідей вже надано, але я не бачив цього уроку. Якщо ви знаєте діаграми Венна, це великий підручник: blog.codinghorror.com/a-visual-explanation-of-sql-joins  Для мене це досить стисне, щоб бути швидким прочитаним, але все ще схоплює цілу концепцію і працює над усіма справами дуже добре. Якщо ви не знаєте, що таке діаграми Venn - вивчіть їх. Потрібно 5-10 хвилин, щоб це зробити, і він допоможе, коли вам потрібно візуалізувати роботу з наборами та керувати операціями на наборах. - DanteTheSmith
@DanteTheSmith Ні, що страждає від тих же проблем, що і діаграми тут. Подивіться мій коментар над цим питанням і нижче, що саме допис в блозі: "Джефф відмовляє в своєму блозі декількома сторінками в коментарях". Діаграми Венна показують елементи в наборах. Просто спробуйте точно визначити, що є наборами, і які елементи на цих діаграмах. Набори ні таблиці та елементи ні їхні рядки. Також можна об'єднати будь-які дві таблиці, отже PK та FK є іррелтою. Все фальшивий Ви робите те, що зробили тисячі інших - отримали неясне враження ти (помилково) припустити має сенс. - philipxy
Чи може хтось відповісти на це з посиланням на індексацію даних Time Series - Внутрішні та зовнішні з'єднання часто не працюють в людському сенсі, коли мова йде про відмітки часу, відмінних лише на мілісекунди. - yeliabsalohcin
@yeliabsalohcin Читайте мої коментарі на цій сторінці (і моя відповідь). Якщо дублікатів рядків немає, то діаграми Венна ілюструють різниця між зовнішніми та внутрішніми з'єднаннями, тому вони ілюструють зовнішні з'єднання в плані внутрішні приєднується і навпаки якщо ви знаєте, що вони роблять. Але діаграми Венна ні ілюструйте, що повернеться або зовнішнє приєднання, або внутрішнє з'єднання з точки зору їхніх внесків крім випадків, коли вхідні дані не мають повторюваних рядків і мають однакові стовпці. (Якщо у вас є інше питання, розмістіть його як питання. Програми не мають значення. "Відповідність" має значення, що залежить від типів і режимів даних.) - philipxy


Відповіді:


Якщо ви приєднаєтесь до стовпців без дублікатів, це дуже поширений випадок:

  • Внутрішнє об'єднання A та B дає результат перетинання B, тобто внутрішню частину a Діаграма Венна перетин

  • Зовнішній зв'язок A та B дає результати A об'єднання В, тобто зовнішні частини діаграми з'єднання Венна.

Приклади

Припустимо, у вас є дві таблиці, кожна з них - одна, а дані - наступні:

A    B
-    -
1    3
2    4
3    5
4    6

Зверніть увагу, що (1,2) унікальні для A, (3,4) є загальними, і (5,6) унікальні для B.

Внутрішнє з'єднання

Внутрішнє з'єднання за допомогою будь-якого з еквівалентних запитів дає перетин двох таблиць, тобто два рядки, які вони мають спільними.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Зліва зовнішня частина

Вліво зовнішнє об'єднання дасть всі рядки в A, а також будь-які загальні рядки в B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

З правого зовнішнього об'єднання

Правильне зовнішнє об'єднання дасть всі рядки в B, а також будь-які загальні рядки в А.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Повний зовнішній зв'язок

Повне зовнішнє об'єднання дасть вам об'єднання A і B, тобто всі рядки в A і всі рядки в B. Якщо щось у A не має відповідної бази в B, то частина B має нуль, а порожній навпаки

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

5427
2017-09-01 22:59



Було б добре збільшити цей приклад, додавши ще один рядок у таблиці B із значенням 4. Це покаже, що внутрішні об'єднання не повинні бути рівними рядами. - softveda
Відмінне пояснення, однак, це твердження: Зовнішній зв'язок A та B дає результати A об'єднання B, тобто зовнішні частини venn діаграми об'єднання. не тлумачиться точно. Зовнішнє об'єднання дасть результати A перетину B на додаток до одного з наступного: весь A (ліва приєднується), все B (правильне приєднання) або всі A та всі B (повне приєднання). Тільки цей останній сценарій дійсно є Союз Б. Тим не менш, добре написане пояснення. - Thomas
Про відповідь! Сподобалося До речі: я до сих пір не можу знайти різницю між тими, що залишилися, LEFT JOIN і LEFT OUTER JOIN і т. Д. Якщо це не є частиною питання, я можу опублікувати новий :) - YvesR
Чи можу я сказати, що FULL JOIN є псевдонімом FULL OUTER JOIN і LEFT JOIN є псевдонімом LEFT OUTER JOIN? - Damian
@ Амер, дякую Приєднатися не гарантує замовлення, вам потрібно буде додати пропозицію ORDER BY. - Mark Harrison


Також ви можете розглянути наступну схему для різних типів приєднання;

visual explanation of joins

Джерело: Visual-Representation-of-SQL-Joins докладно пояснив C.L. Моффат


2443
2018-05-16 23:03



Примітка. У MySQL немає FULL OUTER JOIN. stackoverflow.com/questions/12473210/... - Michael Ozeryansky
Я думаю, ця діаграма передбачає відсутність дубліката Key, що означає Key є унікальним. Якщо Key був не унікальним, я думаю, що результат був би хрестом, а коефіцієнт повернення був би набагато вище, ніж розмір А. - AlikElzin-kilaka
У прикладі FULL OUTER JOIN з виключеною частиною перетину, не буде використано 'A.Key IS NULL', виключити всі рядки з A, тому що якщо ключ є NULL, то за визначенням рядок не існує? Я не бачу, як цей механізм добивається результатів діаграми VENN. - Kelly S. French
@ KellyS.French Перегляньте мої коментарі щодо цього питання та інших відповідей, які пояснюють, як прочитати діаграми Венна. Зони не містять рядків із таблиць A і B. Вони включають певні рядки, зроблені зі спарювання рядка з A і ряду з B. Це також не навіть рядки виводу оператора SELECT. Відповіді діаграми Венна всі бідні. - philipxy
А представляє все потенціал рядки, що надходять з таблиці А, В - це все потенціал рядки, що йдуть з таблиціB. Червоні зони на діаграмі позначають, які з цих рядків дійсно будуть включені в набір результатів. Зауважте, що може бути (і часто) багато, багато інших потенціал Рядки, що йдуть з таблиці, є насправді рядами в цій таблиці. Це тому, що будь-який рядок у таблиці А буде потенційно що відбувається один раз для кожного рядка в таблиці, що посилається на нього. Це називається декартову продукцію. - Stijn de Witt


я рекомендую Статті блогів Джеффа. Найкраще опис, який я коли-небудь бачив, а також візуалізація, наприклад:

Внутрішнє з'єднання:

enter image description here

Повний зовнішній зв'язок:

enter image description here


591
2017-08-30 11:52



Ця схема є дещо помилковою для концепції. Прочитайте коментарі в публікації, а також. - softveda
@ ya23: що ви маєте на увазі під повним зовнішнім об'єднанням? - ursitesion
Окрім того, Джефф відкидає його блог містить кілька сторінок в коментарях: "Коментатори, які вказують на те, що діаграми зламаються у випадку декількох або дубльованих результатів, абсолютно правильні. Я насправді думав про приєднання до первинного ключа, який, як правило, унікальний визначення, хоча приклади не виражені таким чином. Як і у випадку декартової або перехресного продукту, все, що призводить до більшої кількості рядків, ніж ви спочатку почали, абсолютно порушує цілі концепцію діаграми венна, тому пам'ятайте про це ". - philipxy
@philipxy так, аналогія діаграм Венна працює тільки для первинного ключа після ігнорування NULL-це часто не зазначено. Діаграми Венна не допомагають пояснити, як інші стовпці у результуючому наборі заповнюються NULL. - Galax
@Galax На жаль, чи є об'єднання на ключі (не кажучи вже про первинні ключі), діаграми не мають сенсу. (Незважаючи на те, що я цитував Джефа про те, що він вважає, що він це робить.) (Я не розумію ваші "роботи для первинного ключа після ігнорування NULL" або "інші стовпці в результуючому наборі заповнені NULL". Я знаю більше або менш сортувати про те, що ви намагаєтеся сказати, але кореспонденція, крім моєї коментаря до питання комплекс і так це а ясно пояснення Хоча я вітаю його. Точно що групуються як за колами? - philipxy


Діалоги Венна насправді не роблять це для мене.

Наприклад, вони не демонструють ніякої різниці між крос-приєднанням та внутрішнім з'єднанням, або в загальному випадку показують будь-які розбіжності між різними типами приєднання предиката або створюють основу для обґрунтування того, як вони будуть працювати.

Існує ніякої заміни для розуміння логічної обробки і це відносно просто зрозуміти в будь-якому випадку.

  1. Уявіть собі хрест.
  2. Оцініть on пропозиція проти всіх рядків з кроку 1, зберігаючи ті, на яких оцінюється предикат true
  3. (Тільки для зовнішніх з'єднань) додайте назад до будь-яких зовнішніх рядків, які були втрачені на кроці 2.

(NB: на практиці оптимізатор запитів може знайти більш ефективні способи виконання запиту, ніж суто логічне опис вище, але остаточний результат має бути однаковим)

Почну з анімованої версії a повне зовнішнє об'єднання. Подальше пояснення слідує.

enter image description here


Пояснення

Таблиці джерел

enter link description here

Спочатку починайте з a CROSS JOIN (AKA Cartesian Product). Це не має ON і просто повертає кожну комбінацію рядків з двох таблиць.

SELECT A.Colour, B.Colour FROM CROSS JOIN B

enter link description here

Внутрішні та зовнішні з'єднання мають предикат положення "ON".

  • Внутрішнє з'єднання. Оцініть стан у положенні "ON" для всіх рядків у результаті перехресного з'єднання. Якщо істинно повернути об'єднаний рядок. В іншому випадку відкиньте його.
  • Лівий зовнішній приєднатися Так само, як внутрішня підключення, для будь-яких рядків у лівій таблиці, які не відповідають нічого, виводити їх з значеннями NULL для стовпців правого таблиці.
  • Право Зовнішня приєднатися. Так само, як внутрішня підключення, для будь-яких рядків у правій таблиці, які не відповідають нічого, виводити їх з значеннями NULL для стовпців лівої таблиці.
  • Повний зовнішній приєднатися. Точно так само, як внутрішнє об'єднання, потім збережіть невідповідні рядки, що залишилися, як у лівому зовнішньому об'єднанні та правих невідповідних рядках, як у правому зовнішньому об'єднанні.

Деякі приклади

SELECT A.Colour, B.Colour FROM INNER JOIN B ON A.Colour = B.Colour

Вище викладено класичний equi join.

Inner Join

Анімована версія

enter image description here

SELECT A.Colour, B.Colour FROM INNER JOIN B ON A.Colour NOT IN ("зелений", "синій")

Стан внутрішнього з'єднання необов'язково є рівномірним, і йому не потрібно вказувати стовпці з обох (або навіть) таблиць. Оцінюючи A.Colour NOT IN ('Green','Blue') на кожному рядку перехресного приєднання повертається.

inner 2

SELECT A.Colour, B.Colour FROM INNER JOIN B ON 1 = 1

Стан приєднання оцінює значення true для всіх рядків у результатах перехресного з'єднання, так що це є точно так само, як перехресні з'єднання. Я не буду повторювати картину з 16 рядків.

SELECT A.Colour, B.Colour З ЛЕГКОЇ ВНУТРІШНІЙ ВСТАНОВЛЕННЯ B ON A.Colour = B.Colour

Outer Joins логічно оцінюються так само, як і внутрішні з'єднання, за винятком того, що якщо рядок з лівої таблиці (для лівої приєднання) не з'єднується з жодним рядком з правого стільця в цілому, він зберігається в результаті з NULL значення для правих стовпців.

LOJ

SELECT A.Colour, B.Colour FROM LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

Це просто обмежує попередній результат, лише повертаючи рядки де B.Colour IS NULL. У цьому конкретному випадку це будуть рядки, які були збережені, оскільки вони не мали збігу в правій руці таблиці, і запит повертає червоний рядок, не збігається з таблицею B. Це відоме як анти-напівприєднання.

Важливо вибрати стовпчик для IS NULL тест, який або не є нульовим або для якого умова приєднання гарантує будь-яке NULL ці значення будуть виключені, щоб цей шаблон працював коректно, і щоб уникнути просто повернення рядків, які мали NULL значення для цього стовпця на додаток до невідповідних рядків.

loj is null

SELECT A.Colour, B.Colour З ПРАВИХ ЗОВНІШНЬОГО ВСТАНОВЛЕННЯ B НА A.Colour = B.Colour

З правого зовнішнього з'єднання діють так само, як з лівого зовнішнього з'єднання, за винятком того, що вони зберігають невідповідні рядки з правого столу та нульові розширення лівої стовпці.

ROJ

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour

Повні зовнішні з'єднання об'єднують поведінку лівих і правих з'єднань і зберігають невідповідні рядки з лівих та правих таблиць.

FOJ

SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0

Жодні рядки в хресті не збігаються 1=0 предикат Усі рядки з обох сторін зберігаються за допомогою звичайних правил зовнішнього з'єднання з NULL у стовпцях з таблиці на іншій стороні.

FOJ 2

SELECT COALESCE (A.Colour, B.Colour) AS COLOR FROM FULL OUTER JOIN B ON 1 = 0

З незначними зміни до попереднього запиту можна було імітувати a UNION ALL з двох таблиць.

UNION ALL

SELECT A.Colour, B.Colour FROM LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'

Зауважте, що WHERE Застереження (якщо є) логічно проходить після приєднання. Одна з поширених помилок полягає в тому, щоб виконати ліву зовнішню з'єднання, а потім включити пропозицію WHERE зі станом у правому столі, що закінчується, виключаючи невідповідні рядки. Вище закінчується виконання зовнішнього з'єднання ...

LOJ

... І тоді виконується пропозиція "Де". NULL= 'Green' не оцінюється як істина, тому рядок, що зберігається зовнішнім з'єднанням, закінчується відкинутим (поряд з синім), що ефективно перетворює приєднання назад у внутрішній.

LOJtoInner 

Якщо намір було включати в себе лише рядки з B, де Колір є зеленим, і всі рядки з A незалежно від правильного синтаксису

SELECT A.Colour, B.Colour FROM LEFT OUTER JOIN B ON A.Colour = B.Colour і B.Colour = 'зелений'

enter image description here

SQL Fiddle

Див. Ці приклади запустіть жити на SQLFiddle.com.


529
2017-12-13 11:58



Я скажу, що, хоча це не працює для мене майже так само, як і діаграми Венна, я ціную, що люди змінюються і навчаються по-різному, і це дуже добре представлене пояснення, на відміну від того, що я бачив раніше, тому я підтримую @ypercube в нагородження бонусних балів. Також хороша робота, що пояснює різницю в додаванні додаткових умов у пункті JOIN проти пропозиції WHERE. Кудош вам, Мартін Сміт. - Old Pro
@OldPro Діалоги Венна в порядку, наскільки вони йдуть, я думаю, але вони мовчать про те, як представляти хрест приєднатися, або щоб диференціювати один з видів приєднання предикатів, таких як equi join з іншого. Психічна модель оцінки предикату приєднання на кожен рядок результату перехресного з'єднання, потім додавання назад у неперевершені рядки, якщо зовнішнє об'єднання і, нарешті, оцінка того, де працює для мене краще. - Martin Smith
Діалоги Венна добре підходять для представлення об'єднань, перехресть і відмінностей, але не приєднуються. Вони мають незначне освітнє значення для дуже простих об'єднань, тобто приєднується, де умови приєднання до унікальних стовпців. - ypercubeᵀᴹ
@Arth - Ні, ви помиляєтеся. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 це щось діаграми Венна не може проілюструвати. - Martin Smith
@MartinSmith Вау, я згоден, я абсолютно не правий! Занадто використовується для роботи з одним-на-Manys .. спасибі за корекцію. - Arth


Наступне було взято з статті "MySQL - ВІДКЛЮЧЕННЯ ЗЛОЧИНИ та ПРАВО ПРИЄДНАННЯ, INNER JOIN і OUTER JOIN"Грэмом Еллісом у своєму блозі Horses 'Routh.

У такій базі даних, як MySQL, дані поділяються на кілька таблиць, які потім підключені (Joined) разом JOIN в SELECT Команди для читання записів з декількох таблиць. Прочитайте цей приклад, щоб побачити, як це працює.

По-перше, деякі зразки даних:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

РЕГУЛЯРНОГО ПРЯМІ

Якщо ми регулярно об'єднуємося (з жоден із ключових слів INNER, OUTER, LEFT або RIGHT), то ми отримуємо всі записи, які відповідають двом таблицям, і в обох таблицях записуватимуться обидві вхідні таблиці, які не відповідають, не повідомляються :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

LEFT JOIN

Якщо ми виконуємо LEFT JOIN, ми отримуємо всі записи, які співпадають однаково, і IN ADDITION ми отримуємо додаткову рекорд для кожного неперевершеного запису в лівій таблиці приєднання - таким чином забезпечуючи (у цьому прикладі), що кожен PERSON отримує згадування :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

ПРАВО ПРИЄДНУЙТЕ

Якщо ми робимо ПРАВО СПОЖИВАННЯ, ми отримуємо всі записи, що відповідають, і в НІ ДОДАТИ додаткову записку для кожної неперевершеної запису в правій таблиці приєднання - у моєму прикладі, це означає, що кожен властивість отримує згадування, навіть якщо ми не мати дані продавця:

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

INNER JOIN робить повне приєднання, як і перший приклад, і слово "OUTER" може бути додане після слова LEFT або RIGHT у двох останніх прикладах - це передбачено для сумісності ODBC і не додає додаткових можливостей.


291
2018-02-14 05:53



REGULAR JOIN і INNER JOIN це те ж саме. Що хотів сказати Грем Елліс REGULAR це те, що INNER JOIN є "default" JOIN, коли ніхто з LEFT або RIGHT ключові слова були вказані. Якщо ви читаєте весь допис, наприкінці він говорить: "INNER JOIN повний приєднання, як і перший приклад, і слово" OUTER "може бути додане після слова LEFT або RIGHT у двох останніх прикладах - це передбачено для ODBC сумісність і не додає додаткових можливостей ". - vegatripy
Для тих, кого заплутали pid і spid, pid означає "person id", і spid означає "продаж нерухомості id". - Andrew Grimm
Що робити, якщо ми хочемо лише вибрати Mr.BROWN, міс СМІТ та пан Пуллен? - Fortune
@Fortune Select (рядки мають name дорівнює одному з них) від чого? Як це пов'язано з різницею між внутрішнім і зовнішнім об'єднанням? - philipxy
Багато відповідей не думаю про одне - множинність ситуації, і це буде вводити в оману когось, ваша відповідь краще! - rocket1037


Внутрішнє з'єднання

Отримати тільки відповідні рядки, тобто A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Лівий зовнішній приєднатися

Виберіть усі записи з першої таблиці та будь-які записи у другій таблиця, яка відповідає об'єднаним клавішам.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Повний зовнішній приєднатися

Виберіть усі записи з другої таблиці та будь-які записи в першому таблиця, яка відповідає об'єднаним клавішам.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Список літератури


114
2018-01-27 12:16



Яка назва інструменту? Я вважаю це цікавим, оскільки він показує кількість рядків і venn-діаграм - Grijesh Chauhan
@GrijeshChauhan Datamartist :) - Tushar Gupta
@Trushar :( це не для системи Linux .. - Grijesh Chauhan
@GrijeshChauhan Так, але ви можете спробувати запустити його за допомогою вино . - Tushar Gupta
Ох! так я ..Я використав SQLyog, використовуючи вино .. теж є PlayOnLinux - Grijesh Chauhan


Приєднується використовуються для об'єднання даних з двох таблиць, в результаті чого створюється новий тимчасовий таблиця. Об'єднання виконується на основі того, що називається предикатом, який визначає умову для використання для приєднання. Різниця між внутрішнім з'єднанням та зовнішнім приєднанням полягає в тому, що внутрішня приєднання поверне тільки ті рядки, які дійсно співпадають, виходячи з предикату приєднання. Давайте розглянемо таблицю "Співробітники та місце розташування":

enter image description here

Внутрішнє з'єднання:- Внутрішній зв'язок створює нову таблицю результатів, об'єднуючи значення стовпчиків з двох таблиць (Працівник і Місцезнаходження) на основі приєднання-предиката. Запит порівнює кожен рядок з Працівник з кожним рядком Місцезнаходження щоб знайти всі пари рядків, які задовольняють предикат join. Коли предикат приєднання виконується за допомогою зіставлення значень не-NULL, значення стовпців для кожної зіставленої пари рядків з Працівник і Місцезнаходження об'єднані в рядок результату. Ось що буде виглядати SQL для внутрішнього об'єднання:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Ось що приведе результат роботи цього SQL: enter image description here enter image description here

Вільний приєднуйся: - Зовнішній зв'язок не вимагає кожного запису в двох об'єднаних таблицях, щоб мати відповідний запис. Об'єднана таблиця зберігає кожен запис, навіть якщо не існує жодного іншого відповідного запису. Зовнішні з'єднання далі діляться на ліво зовнішні з'єднання та права зовнішні з'єднання залежно від того, які рядки таблиці зберігаються (вліво або вправо).

Зліва направо: Результат лівого зовнішнього об'єднання (або просто залишена приєднання) для таблиць Працівник і Місцезнаходження завжди містить всі записи "лівий" таблиці (Працівник), навіть якщо умова join-condition не знайде відповідних записів у "правильній" таблиці (Місцезнаходження) Ось що означає SQL для зовнішнього об'єднання зліва, використовуючи таблиці вище:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Нижче описано, як виглядає результат роботи цього SQL: enter image description here enter image description here

Право Зовнішнє приєднання: - Право зовнішнє об'єднання (або правильне приєднання) дуже нагадує лівий зовнішній зв'язок, за винятком випадків, коли обробка сторінок була зворотною. Кожен рядок з "правильного" столу (Місцезнаходження) з'являться у приєднаній таблиці принаймні один раз. Якщо немає відповідного рядка з "лівий" таблиці (Працівник) існує, NULL з'явиться в стовпцях з Працівник для тих записів, які не відповідають Місцезнаходження. Ось що виглядає SQL:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Використовуючи наведені вище таблиці, ми можемо показати, який набір результатів правильного зовнішнього з'єднання буде виглядати:

enter image description hereenter image description here

Повне зовнішнє об'єднання: - Повний зовнішній зв'язок або повне приєднання - зберегти невідповідну інформацію, включивши невідповідні рядки в результати приєднання, використовуючи повне зовнішнє об'єднання. Вона включає в себе всі рядки з обох таблиць, незалежно від того, чи має інший таблицю відповідне значення. enter image description here

Джерело зображення

Довідник по MySQL 8.0 - Приєднати синтаксис

Oracle Join операції


108
2017-12-18 06:54





Прості слова:

Ан внутрішнє з'єднання одержувати тільки відповідні рядки.

У той час як ан зовнішнє об'єднання одержувати відповідні рядки з однієї таблиці та всіх рядків в іншій таблиці ... результат залежить від того, який з них ви використовуєте:

  • Ліворуч: Відповідні рядки в правому столі та всі рядки в лівій таблиці

  • Правильно: Відповідні рядки в лівій таблиці та всі рядки у правому столі або

  • Повний: Всі рядки у всіх таблицях. Не має значення, чи є матч чи ні


101
2018-01-12 11:07



@nomen Не те, що ця відповідь на це розв'язує, але INNER JOIN - це перетин, а FULL OUTER JOIN - відповідний UNION якщо лівий та правий ряди / кола містять рядки (відповідно) LEFT & RIGHT приєднання. PS Ця відповідь незрозуміла про рядки у вхідному і вихідному. Він змішує "у лівій / правій таблиці" з "має ліворуч / правою частиною вліво / вправо", і він використовує "відповідний рядок" або "всі", щоб означати рядок, простягнутий рядком від іншого столу проти нулів. - philipxy


Внутрішнє об'єднання відображає лише рядки, якщо на іншій (правій) стороні приєднання є відповідний запис.

А (ліворуч) зовнішнє об'єднання показує рядки для кожної запису зліва, навіть якщо не існує відповідних рядків на іншій (правій) стороні об'єднання. Якщо немає відповідного рядка, стовпці для іншої (правій) стороні будуть відображати NULL.


92
2017-09-01 22:38





Внутрішні з'єднання вимагають наявності запису в пов'язаній ідентифікаційній таблиці.

Зовнішні з'єднання повертають записи для лівої сторони, навіть якщо для правильної сторони нічого не існує.

Наприклад, у вас є замовлення та таблиця OrderDetails. Вони пов'язані з "OrderID".

Замовлення

  • OrderID
  • Ім'я клієнта

Деталі замовлення

  • OrderDetailID
  • OrderID
  • Назва продукту
  • Кол
  • Ціна

Запит

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

повертає лише замовлення, які також мають щось у таблиці "OrderDetails".

Якщо ви зміните його на ВНУТРІШНЬО ЛІВОРА

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

то він повертає записи з таблиці замовлень, навіть якщо вони не мають записів OrderDetails.

Ви можете використовувати це, щоб знайти Замовлення, які не мають OrderDetails, що вказують на можливий сироватковий порядок, додавши депозит, як WHERE OrderDetails.OrderID IS NULL.


67
2017-09-01 22:47



Я ціную простий, але реалістичний приклад. Я змінив запит, як SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC до SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC (MySQL) з успіхом. Я не був впевнений в додаткових умовах, вони добре поєднуються ... - PhiLho


Прості слова:

Внутрішнє з'єднання -> Взяти ТІЛЬКИ загальні записи з батьківських і дитячих таблиць WHERE первинний ключ батьківського столу відповідає зовнішньому ключові в таблиці дитини.

Зліва приєднатися ->

псевдокод

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Правильно приєднатися : Точно протилежне лівому приєднанню. Поставте назву таблиці у стовпці LEFT JOIN у правій частині правого об'єднання, ви отримаєте такий самий вихід, як LEFT JOIN.

Зовнішній приєднання : Показати всі записи в обох таблицях No matter what. Якщо записи в лівій таблиці не збігаються з правим столом на основі основного, клавіша Forieign, то в результаті приєднання використовуйте значення NULL.

Приклад:

Example

Давайте припустимо тепер 2 столу

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Тут співробітники таблиці є Майстер-стіл, phone_numbers_employees є дитячий стіл (він містить emp_id як зовнішній ключ, який з'єднується employee.id тому його дитячий стіл.)

Внутрішні приєднання 

Візьміть записи з 2 таблиць ТІЛЬКИ, якщо первинний ключ працівників таблиці (його ідентифікатор) відповідає зовнішньому ключові таблиці дитини table_numbers_employees (emp_id).

Тож запит буде:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Тут візьміть тільки відповідні рядки за допомогою первинної ключа = зовнішнього ключа, як було пояснено вище. Нижче невідповідні рядки з первинним ключем = зовнішніми ключовими словами пропускаються як результат приєднання.

Зліва приєднується :

Зліва приєднання зберігає всі рядки лівого столу, незалежно від того, чи є рядок, що збігається з правого столу.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Зовнішні з'єднання :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Діаграматично це виглядає так:

Diagram


58
2018-02-19 04:50



Результат не має нічого (по суті) з основними / унікальними ключами / кандидатами та зовнішніми ключами. Бавіорію можна і слід описати без посилання на них. Розраховується перехресна з'єднання, потім відфільтровуються рядки, що не відповідають умовам ON; Крім того, для зовнішніх з'єднань ряди фільтруються / неперевершені рядки розширюються на NULL (для лівий / правій / повний і включений. - philipxy