Різниця між ПРИЄДНАЙТЕСЯ та ВНУТРІШНЬОЮ ПРИЄДНАЙТЕСЬ


998

Обидва ці приєднання дадуть мені однакові результати:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

проти

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Чи є різниця між твердженнями у виконанні чи іншим способом?

Чи відрізняється вона між різними реалізаціями SQL ?


2
Дивіться це запитання: < stackoverflow.com/questions/448023?sort=newest >
Джоель Коухорн

6
Як зауваження: CROSS JOIN - це добре знати тип приєднання (він відрізняється від INNER JOIN).
Серж

Відповіді:


1092

Вони функціонально еквівалентні, але INNER JOINможуть бути трохи зрозумілішими для читання, особливо якщо запит включає в себе інші типи приєднання (тобто LEFTабо RIGHTабо CROSS).


11
Чи справедливо це для всіх баз даних (наприклад, SQL, постгреси?) Хтось знає посилання на документацію, що пояснює це?
Чогг

4
Це стандарт ANSI SQL. Дивіться більше: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
індійський

14
Запит досить чіткий, просто написавши ПРИЄДНАЙТЕСЬ, ІННЕР - це лише шум.
Іванзіньо

22
Можливо, я пурист, але я думаю, що під час написання SQL краще бути явним, ніж неявним. INNER JOIN є більш читабельним, особливо у складних запитах.
bruceskyaus

3
@Ivanzinho: Обведення клавіатури не є мірою запиту чи складності програми. Справжня життєва складність походить від ремонтопридатності, де читабельність відіграє головну роль. Справа в тому, що, коли він говорить INNER JOIN, ви можете бути впевнені в тому, що це робить, і що це повинно бути саме так, тоді як звичайний ПРИЄДНАЙТЕ залишить вас або когось іншого, цікавившись, що стандарт сказав про впровадження та чи був ІННЕР / ЗОВНІШНЯ / ВЛІВО, залишена випадково або за призначенням.
Tuukka Haapaniemi

243

Ні, різниці немає, чистий синтаксичний цукор .


22
Я б не назвав це синтаксичним цукром. Можливо, тип приєднання за замовчуванням, "стенограма" або "псевдонім".
mk12

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

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

10
@Quassnoi сам факт , що це питання поставлене, показує absense з INNERнічого НЕ робить легше читати запит. Наскільки я знаю, це JOINмогло б означати, LEFT JOINякби його не прояснили відповіді тут.
martennis

2
@Quassnoi Вступне твердження wiki у вашому коментарі стосується синтаксичного цукру, але воно є недостатнім як визначення. Синтаксичне цукор - це простіший синтаксис для особливих випадків складного синтаксису. Більш доречно сказати, що ІННЕР - це «шумне слово».
philipxy

143

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

INNER JOIN є типовим, якщо ви не вказуєте тип під час використання слова JOIN.

Ви також можете скористатись СПІЛКУВАННЯ ВЛЕВОГО або ПРАВИШЕ ПРИЄДНАЙТЕСЬ, і в цьому випадку слово ВИХІД є необов’язковим, або Ви можете вказати CROSS JOIN.

АБО

Для внутрішнього з'єднання синтаксис:


ВИБІРТЕ ... З ТАБЛИЦІ
[ ІННЕР ] Приєднуйтесь до таблиці

(іншими словами, ключове слово "ІННЕР" необов'язково - результати однакові з ним або без нього)



54

Аналогічно зі OUTER JOINsсловом "OUTER"необов'язково. Це LEFTабо RIGHTключове слово, яке робить JOINан "OUTER" JOIN.

Однак я чомусь завжди використовую "OUTER"як LEFT OUTER JOINніколи LEFT JOIN, але ніколи не використовую INNER JOIN, а скоріше просто використовую "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
Я протилежний вам: я завжди кажу "ВНУТРІШНЯ ПРИЄДНАЙТЕСЬ", але я ніколи не використовую ВНУТРІ; тому "ЛІВО ПРИЄДНАЙТЕСЬ" та "ПРАВА ПРИЄДНАЙТЕ". Здогадуюсь, я просто підтримую кількість своїх персонажів постійними!
Стівен Холт

10
@ Jonathan. Немає поняття напрямку внутрішнього з'єднання. Зовнішні з’єднання можуть створювати неперевершені набори результатів, а ті можуть змінюватись залежно від напрямку. Внутрішні вимагають відповідності, тому напрямок не має значення.
Карл Кієнінгер

32

Як свідчать інші відповіді, у вашому прикладі різниці немає.

Тут задокументований відповідний біт граматики

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

Показано, що всі необов’язкові. На цій сторінці далі пояснюється це

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

Граматика також вказує на те, що є час, коли INNER це потрібно. Указуючи підказку про приєднання.

Дивіться приклад нижче

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

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

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