Sql - в чому різниця між inner join, left join, right join і full join

Ці картини не роблять це для мене. Чому верхня права картинка не просто SELECT * FROM TableA ;. Чому верхня ліва фотографія не просто SELECT * FROM TableB ;. Чому верхня середня фото не SELECT * FROM A INTERSECT SELECT * FROM B. і т.д - onedaywhen 20 травня '17 о 19:08

У мене є проблема з усім поняттям: це візуальні уявлення об'єднання, перетину, виключаючи і т. Д. У них немає візуального представлення проекції, тому не можуть бути об'єднаннями. Я думаю, це буде плутати більше, ніж користь, коли контекст з'єднується. - onedaywhen 20 травня '17 о 19:08

@onedaywhen - ви перша людина на цьому, кому важко було зрозуміти - Pranay Rana 20 травня '17 о 19:08

Хм, немає поняття, що представляє червоний. - Jonathon Wisnoski 20 травня '17 о 19:08

Я повинен погодитися, назва об'єднань (зліва і справа) абсолютно безглуздо, оскільки вона має на увазі конкретні напрямки. FULL JOIN повинен бути UNION JOIN, INNER JOIN повинен бути INTERSECT JOIN, а LEFT / RIGHT повинен бути [RELATIVE] ДОДАТКОВИМ приєднання, де ви вказуєте, яка таблиця є доповнює стороною. Ви можете сказати, що дизайнер прийшов з мови, який читає зліва направо. - Rahly 20 травня '17 о 19:08

SQL - це мова, яка читає зліва направо - так. ) - bjedrzejewski 20 травня '17 о 19:08

Ця діаграма має одну серйозну проблему, яка полягає в тому, що вона повністю ігнорує різницю між напівз'єднання і об'єднаннями. Тобто: select a. * From a inner join b on a.id = b.id проти select a. * From a where id in (select id from b). Це пов'язано з тим, що з'єднання SQL не є перетином двох множин - об'єднання може бути одним -> одним, одним -> багатьма або багатьма -> багатьма. Таким чином, на діаграмі Венна фактично неможливо уявити: вся ця діаграма показує вам, «яка частина таблиці буде брати участь в об'єднанні». В цьому випадку select a. * From a cross join b повинна мати таку ж діаграму, як повне зовнішнє з'єднання. - ubanerjea 20 травня '17 о 19:08

@ubanerjea Правильно: діаграма не може привести його до об'єднання ЛІВИХ з'єднань в повторювані рядки через (потенційно ненавмисного) поведінки «один до багатьох», коли В має більш одного ключа, що відноситься до A.key. Відповідь Арунпрасантеша К.В. на мій погляд, більш всеосяжний. - Eric 20 травня '17 о 19:08

А як щодо «природних об'єднань». Може хто-небудь додати своє зображення до цього зображення, будь ласка? - skan 20 травня '17 о 19:08

Я не думаю, що ці діаграми пояснюють що завгодно, навіть візуально, якщо у вас немає глибокого і конкретного розуміння того, що він намагається показати. Для кого-то, хто намагається вперше вивчити об'єднання, я не думаю, що вони корисні взагалі. - BadHorsie 20 травня '17 о 19:08

@onedaywhen 1) Ви змішуєте червоний і білий, червоний - вибрані елементи. Верхній лівий еквівалент select * from TableA. якщо в TableB немає елементів, відповідних умові on. 2) select a.x from TableA a включає тільки стовпці з TableA. а select a.x, b.x from TableA a left join TableB b on a.abs = b.bas також можуть бути результати з TableB. У разі 1: n рядка TableA можуть відображатися кілька разів (з додатковими результатами з TableB), в разі n: m ви навіть можете дістатися до n * m рядків, в разі n: 1 Ви, ймовірно, побачите рядки TableB помножити. - Tino 20 травня '17 о 19:08

@Tino: ІМО - кращий опис зовнішнього з'єднання: «свого роду шлюб з дробовиком: він змушує таблиці в якийсь союз - так, я маю на увазі союз, а не з'єднання, навіть якщо ці таблиці не відповідають звичайним вимогам для об'єднання Фактично це робиться шляхом заповнення однієї або обох таблиць значеннями NULL перед виконанням об'єднання, тим самим, в кінці кінців, щоб вони відповідали цим звичайним вимогам ». (Дата CJ) - onedaywhen 20 травня '17 о 19:08

@onedaywhen OMG, це просто занадто неточно. Оскільки об'єднання є терміном SQL, ці слова сильно заплутають наших дорогих стартерів! Крім того, праве нижнє зображення можна розглядати скоріше як «реальний» союз, тому що є тільки незв'язані частини - і це для мене схоже на типовий шлюб дробовика набагато краще;) - Tino 20 травня '17 о 19:08

@Pranay Рана Я вважаю, що нам може знадобитися умова «І» в тому, в якому розділі останнього малюнка «Outer Exclusion JOIN», так що ми отримаємо бажаний результат взаємодії B з союзом B. Мінус A. Я відчуваю, що запит потрібно оновити до SELECT FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL І B.Key IS NULL Якщо ми використовуємо OR, тоді ми отримаємо всі результати A Union B - vinsinraw 20 травня '17 в 19:08

INNER JOIN отримує всі записи, які є загальними між обома таблицями

LEFT JOIN отримує всі записи з пов'язаної таблиці LEFT, але якщо ви вибрали декілька стовпців з таблиці RIGHT, якщо немає пов'язаних записів, ці стовпці будуть містити NULL

RIGHT JOIN подібний вище, але отримує все записи в таблиці RIGHT

FULL JOIN отримує всі записи з обох таблиць і поміщає NULL в стовпці, де відповідні записи не існує в протилежному таблиці

відповідь дан Brian Leeming 20 травня '17 о 19:07

Дякую за текстове пояснення! Це працювало для мене набагато краще, ніж картинки. - Richard Connamacher 20 травня '17 о 19:07

Це технічно невірно: «INNER JOIN отримує всі записи з однієї таблиці, які мають деяку пов'язану запис в другій таблиці» - INNER JOIN не просто повертає записи з однієї таблиці. - nietaki 20 травня '17 о 19:07