ЛЕВИЙ ПРИЄДНАЙТЕСЬ проти ЛІВНЕГО ВНУТРІШНОГО ПРИЄДНАННЯ в SQL Server


1595

У чому різниця між LEFT JOINі LEFT OUTER JOIN?


213
Жоден! OUTERНеобов'язкове ключове слово.
jarlh

9
Діаграми Венна не підходять для відповідей на це питання. Відповідь на це питання - Ні . Дивіться перший коментар.
філіпсі

3
Венни діаграми ілюструють різницю в вихідних рядках для особливих випадків по внутрішньому проти зовнішнього з'єднання . Якщо не введено жодних нульових чи дублюючих рядків (тому ми можемо взяти таблицю як набір значень, що оцінюються за рядками, і використовувати нормальну математичну рівність), тоді ліві та праві кола містять вихідні таблиці / набори з’єднання ліворуч та праворуч . Але якщо введені нульові чи дублюючі рядки, то так важко пояснити, які кола - це набори, і як ці набори відносяться до таблиць / пакетів введення та виведення, що діаграми Венна не корисні. Дивіться мої коментарі щодо інших зловживань діаграмою Венна.
філіпсі

Відповіді:


2236

Відповідно до документації: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Ключове слово OUTERпозначено як необов’язкове (укладається у квадратні дужки). У цьому конкретному випадку, вказуєте ви OUTERчи ні, це не має значення. Зауважте, що хоча інші елементи пункту приєднання також позначені як необов'язкові, їх вимкнення змінить значення.

Наприклад, вся частина типу JOINпункту є необов’язковою, і в цьому випадку за замовчуванням, INNERякщо ви просто вкажете JOIN. Іншими словами, це законно:

SELECT *
FROM A JOIN B ON A.X = B.Y

Ось список еквівалентних синтаксисів:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Також подивіться на відповідь, яку я залишив на це інше питання ТА: SQL зліва приєднатися до декількох таблиць у рядку ВІД? .

введіть тут опис зображення


135
Абсолютно правильно. OUTER дозволено для сумісності з ANSI-92.
Шон Рейлі

11
@ LasseV.Karlsen хіба не було б краще мати INNER JOINправоруч і лише JOINзліва в списку еквівалентів?
nawfal

8
@ LasseV.Karlsen Я просто мав на увазі, що ліва сторона має лаконічну форму, а права - розширену форму. Я думав, що це зробить цілісним, якщо ви дотримуєтесь того ж і для JOINs.
nawfal

30
@Outlier Це ваша прерогатива, але явно 451 людина вважала, що відповідь хороша. Якщо чесно, якщо одна відповідь каже X, а інша відповідь каже X і посилається на документацію, а також копіює відповідні частини документації у відповідь, моє голосування переходить до другої відповіді, і саме тому я пишу свої відповіді так Я згоден. Те, що хтось стверджує, X, це не добре. Якщо ви можете довести X, це краще (не маючи незначної відповіді Сатіва). Але це ваша прерогатива думати, що ви хочете. Я сумніваюся, чому ви вважаєте, що це безглуздо, чи відповідь в будь-якому випадку невірна?
Лассе В. Карлсен

7
@Outlier І якщо чесно, якщо ти не хочеш читати мої "довгі" відповіді, то моя відповідь була не для тебе. Для всіх інших, хто приїжджає сюди, цікаво одне і те ж і хочеться отримати інформацію про те, чому це так, і де знайти більше інформації тощо. Ясно, що ви такий тип хлопця, який хотів би відповісти: тут не є юридичною відповіддю на Stack Overflow, і не повинно бути.
Лассе В. Карлсен

699

Щоб відповісти на ваше запитання , немає різниці між НАЛЕГИМОЮ ПРИЄДНАЙТЕ та ЛІВНІЙ ВІДПОЛУЧАЙТЕ, вони точно такі, що сказали ...

На верхньому рівні в основному є 3 типи приєднань:

  1. ІННЕР
  2. ЗОВНІШНІ
  3. КРЕС

  1. INNER JOIN - отримує дані, якщо вони є в обох таблицях.

  2. Зовнішнє приєднання складається з 3 типів:

    1. LEFT OUTER JOIN - отримує дані, якщо вони є в лівій таблиці.
    2. RIGHT OUTER JOIN - отримує дані, якщо вони є у правій таблиці.
    3. FULL OUTER JOIN - отримує дані, якщо вони є в будь-якій з двох таблиць.
  3. CROSS JOIN , як випливає з назви, робить те, [n X m]що приєднує все до всього.
    Подібно до сценарію, коли ми просто перераховуємо таблиці для приєднання (у FROMпункті SELECTзаяви), використовуючи коми для їх розділення.


Бали, які слід зазначити:

  • Якщо ви просто згадаєте, JOINто за замовчуванням це а INNER JOIN.
  • Приєднання OUTERповинно бути LEFT| RIGHT| FULLне можна просто сказати OUTER JOIN.
  • Ви можете кинути OUTERключове слово і просто сказати LEFT JOINабо RIGHT JOINабо FULL JOIN.

Для тих, хто хоче візуалізувати їх краще, перейдіть за цим посиланням: Візуальне пояснення приєднання до SQL


17
Дуже гарна відповідь. Це буде зрозуміліше, якщо ви скажете "ВЛЕШИЙ З'ЄДНУЙТЕ ПРИЄДНАЙТЕСЬ - отримує всі дані з лівої таблиці з відповідними даними праворуч, якщо вони попередньо встановлені". для 2.1 (і аналогічна зміна для 2.2)
ssh

1
Також ви можете зробити перехресне з'єднання, просто "виберіть * з TableA, TableB"
om471987

3
Вибачте, якщо я некробупірую, але це CROSS JOINте саме, що FULL JOIN?
Технічний

9
@RhysO ні, CROSS JOIN - декартовий продукт, тобто CROSS JOIN таблиці, що має n рядів, а таблиця, що має m рядків, завжди буде давати (n * m) рядків, тоді як ПОВНОГО ВІДПРИЄДНАННЯ таблиці, маючи n рядків, з таблицею, що має m рядків, дасть максимум (n + m) рядків
sactiw

1
@sactiw розглянути можливість додати спеціальну примітку до вашої цінної відповіді про різницю між Cross Joinі Full Outer Join... певним чином здається схожим.
Мануель Йордан

356

Яка різниця між лівим з'єднанням та лівим зовнішнім з'єднанням?

Нічого . LEFT JOINі LEFT OUTER JOINє рівнозначними.


13
Ем привіт! хто проголосував за це? ПРИЄДНАЙТЕСЬ ЛІВО - це те саме, що і ЛЕВІШЕ ВІДХОДЖУЙТЕ
Мітч Пшеничний

7
Це стосується Microsoft SQL Server та будь-яких інших сумісних з SQL RDBMS.
Білл Карвін

7
Було б непогано, якщо ви додали посилання або пояснення щодо того, чому OUTERце необов’язково.
Нуль3

7
Тут найбільш лаконічна, точна відповідь.
Маначі

4
Дякую. Прийнята відповідь мала занадто багато інформації, яка залишила мене більше розгубленою. Це саме те, що мені потрібно було знати, і відповісти на початкове запитання прямо до суті.
Бекон Бред

66

Я DBA PostgreSQL, наскільки я міг зрозуміти різницю між різницею зовнішніх чи не зовнішніх приєднань - це тема, яка має значну дискусію по всьому Інтернету. До сьогодні я ніколи не бачив різниці між цими двома; Тож я пішов далі і намагаюся знайти різницю між тими. Наприкінці я прочитав всю документацію про це і знайшов відповідь на це,

Отже, якщо ви подивитеся на документацію (принаймні, в PostgreSQL), ви можете знайти цю фразу:

«Слова INNERі НЕ OUTERє обов'язковими у всіх формах. INNERЄ за замовчуванням, LEFT, RIGHTі FULLмає на увазі зовнішнє з'єднання.»

Іншими словами,

LEFT JOINі LEFT OUTER JOINСАМИ ТОЙ

RIGHT JOINі RIGHT OUTER JOINСАМИ ТОЙ

Я сподіваюся, що це може стати внеском для тих, хто все ще намагається знайти відповідь.


60

Left Joinі Left Outer Joinє одним і тим же . Перший є скороченням для останнього. Те ж саме можна сказати і про стосунки Right Joinта Right Outer Joinстосунки. Демонстрація проілюструє рівність. Робочі приклади кожного запиту були надані за допомогою SQL Fiddle . Цей інструмент дозволить обробляти запит.

Дано

введіть тут опис зображення

Приєднуйтесь ліворуч і ліворуч приєднуйтесь

введіть тут опис зображення

Результати

введіть тут опис зображення


Правильне приєднання та право зовнішнє приєднання

введіть тут опис зображення

Результати

введіть тут опис зображення


43

Мені легше думати про Joins у такому порядку:

  • CROSS JOIN - декартовий продукт обох таблиць. Тут починаються ВСІ приєднання
  • ВНУТРІШНЯ ПРИЄДНАЙТЕСЬ - КРОВИЙ ПРИЄДНАЙТЕСЬ із доданим фільтром.
  • OUTER JOIN - ВНУТРІШНЯ ПРИЄДНАННЯ з пропущеними елементами (з таблиці Вліво або Вправо), доданих згодом.

Поки я не з'ясував цю (відносно) просту модель, JOINS завжди була трохи більше чорним мистецтвом. Тепер вони мають ідеальний сенс.

Сподіваюся, що це допомагає більше, ніж бентежить.


Це не дає відповіді на запитання.
philipxy

33

Чому ЛІВО / ВПРАВО та ЛІВО ВІД / ПРАВО ВНУТРІ однакові? Пояснимо, чому ця лексика. Зрозумійте, що приєднання Ліворуч та ВПРАВО - це конкретні випадки приєднання ВНУТРІШНЬОГО, і тому не може бути нічим іншим, як ЗОВНІШНІЙ ВІД / ВІД ПРАВА. Об'єднання ВНУТРИХ також називається ПОВНИМИ ВІДКЛЮЧЕННЯМ на відміну від приєднання ЛІВО та ПРАВО, які є ЧАСТИНИМИ результатами приєднання ВИХІД. Дійсно:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Зараз зрозуміло, чому ці операції мають псевдоніми, а також зрозуміло, що існують лише 3 випадки: ІННЕР, ВНУТРІШНІЙ, КРОСС. З двома підпунктами для зовнішнього. Лексика, спосіб пояснення вчителів, а також деякі відповіді вище, часто дозволяють зробити так, що існує багато різних типів приєднання. Але насправді це дуже просто.


1
"зрозуміло, що існує лише 3 випадки": цікаво, але хибно. Вважайте, що внутрішній приєднання - це спеціалізований перехресний приєднання (тобто предикати перемикання приєднання до пункту де). Далі врахуйте, що зовнішнє з'єднання зовсім не є об'єднанням, а є об'єднанням, де замість стовпців "відсутні" використовуються нулі. Тому можна стверджувати, що хрест - єдине необхідне з'єднання. Зауважимо, що сучасне мислення в реляційній теорії полягає в тому, що природне приєднання задовольняє всім вимогам приєднання. Убік: чи можете ви пояснити, чи / як лексика " JOINпередбачає INNER JOIN" відповідає вашим міркуванням щодо зовнішнього вокабу приєднання?
onedaywhen

27

Щоб відповісти на ваше запитання

У сервер Sql приєднується синтаксис OUTER необов’язковий

Це згадується у статті msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Отже, у наступному списку показано приєднання еквівалентних синтаксисів із та без ВІН

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Інші еквівалентні синтаксиси

INNER JOIN => JOIN
CROSS JOIN => ,

Настійно рекомендую Dotnet Mob Artice: приєднується до сервера Sql введіть тут опис зображення


2
Повторно зловживайте діаграмами Венна тут, дивіться мій коментар до питання.
philipxy

20

Є лише 3 приєднання:

  • A) Перехресне з'єднання = декартовий (напр .: таблиця A, таблиця B)
  • B) Внутрішня приєднання = ПРИЄДНАЙТЕСЬ (наприклад: Таблиця A Таблиця приєднання / Внутрішня приєднання)
  • C) Зовнішнє приєднання:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Сподіваюся, це допоможе.


1
Так 5 приєднується загалом.
Zeek2

19

В основному є три типи ПРИЄДНАЙТЕСЬ

  1. Внутрішня: отримує дані, які є в обох таблицях
    • Тільки ПРИЄДНАЙТЕ означає ВНУТРІШНЕ ПРИЄДНАННЯ
  2. Зовнішні: бувають трьох типів

    • LEFT OUTER - - отримує дані, наявні лише у лівій таблиці та відповідному стані
    • ВПРАВО - - отримує дані, наявні лише у правій таблиці та відповідному стані
    • FULL OUTER - - отримує дані, наявні в будь-якій або обох таблицях
    • (Вліво або Вправо або ПОВНО) ЗОВНІШНЕ ПРИЄДНАННЯ можна писати без написання "OUTER"
  3. Cross Join: приєднується до всього


16

Синтаксичний цукор робить більш очевидним для випадкового читача, що приєднання не є внутрішнім.


2
Отже ... що ж таке ПОВНОГО ПРИЄДНАННЯ?
Емі Б

5
tableA ПОВНОГО ПРИЄДНАЙТЕСЬ ПРИЄДНУЙТЕСЯ tableB надасть вам три типи записів: всі записи в tableA без відповідного запису в tableB, всі записи в tableB без відповідного запису в tableA, і всі записи в tableA з відповідним записом у tableB.
Дейв ДуПлантіс

4

Просто в контексті цього питання я хочу також опублікувати 2 оператора "ЗАЯВА":

ПРИЄДНАЄТЬСЯ :

  1. ВНУТРІШНЯ ПРИЄДНАЙТЕСЬ = ПРИЄДНАЙТЕ

  2. ЗОВНІШНЕ ПРИЄДНАЙТЕСЬ

    • ЛЕВІШЕ ВІДПОЛУЧАЙТЕ = ЛІВНІ ПРИЄДНАЙТЕСЬ

    • ПРАВО ПРИЄДНУЙТЕСЬ ПРИЄДНАЙТЕСЬ = ПРАВА ПРИЄДНАЙТЕСЬ

    • ПОВНИЙ ПРИЄДНАЙТЕСЬ = ПОВНИЙ ПРИЄДНАЙТЕСЬ

  3. КРОВИЙ ПРИЄДНАЙТЕ

SELF-JOIN : Це не зовсім окремий тип приєднання. Це в основному приєднання таблиці до себе, використовуючи одне з вищезазначених приєднань. Але я відчув, що варто згадати в контексті ПРИЄДНАЙТЕСЬ із обговореннями, оскільки цей термін ви почуєте від багатьох у спільноті розробників SQL.

ЗАЯВА :

  1. CROSS APPLY - Подібно до ВНУТРІШНЬОГО ПРИЄДНАННЯ (Але додав перевагу в тому, що можна обчислити щось у правій таблиці для кожного рядка лівої таблиці і повертатиме лише відповідні рядки)
  2. ВНУТРІШНЕ ЗАСТОСУВАННЯ - Подібно ЛІФТУ ЗОВНІШНЬОМУ ПРИЄДНАННІ (Але додав перевагу в тому, що зможе обчислити щось у правій таблиці для кожного рядка лівої таблиці і поверне всі рядки з лівої таблиці незалежно від відповідності правої таблиці)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Приклад із реального життя, коли використовувати OUTER / CROSS APPLY в SQL

Я вважаю оператора APPLY дуже вигідним, оскільки вони дають кращу продуктивність, ніж робити ті ж обчислення в підзапиті. Вони також є заміною багатьох функцій Analytical у старих версіях SQL Server. Ось чому я вважаю, що після зручності роботи з JOINS, один розробник SQL повинен спробувати вивчити операторів APPLY далі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.