Разница между JOIN и INNER JOIN

1001

Оба этих соединения дадут мне одинаковые результаты:

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

против

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

Есть ли разница между утверждениями в исполнении или иным образом?

Отличается ли он между разными SQL реализациями ?

driis
источник
2
Посмотрите этот вопрос: < stackoverflow.com/questions/448023?sort=newest >
Джоэл Кохорн
6
В качестве примечания: CROSS JOIN - это удобный тип соединения (он отличается от INNER JOIN).
Серж

Ответы:

1093

Они функционально эквивалентны, но INNER JOINмогут быть немного понятнее для чтения, особенно если в запрос включены другие типы соединения (т. Е. LEFTИли RIGHTили CROSS), включенные в него.

бледная лошадь
источник
11
Это правда для всех баз данных (например, SQL, postgres?) Кто-нибудь знает ссылку на документацию, объясняющую это?
Чогг
4
Это стандарт ANSI SQL. Смотрите больше: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
индийский
14
Запрос достаточно ясен, просто написав JOIN, INNER - это просто шум.
Иванзиньо
22
Может быть, я пурист, но я думаю, что при написании SQL лучше быть явным, чем неявным. INNER JOIN более читабелен, особенно в сложных запросах.
Bruceskyaus
3
@Ivanzinho: нажатия клавиш не являются мерой сложности запроса или программы. Сложность реальной жизни обусловлена ​​ремонтопригодностью, где удобочитаемость играет важную роль. Тот факт, что когда он говорит INNER JOIN, вы можете быть уверены в том, что он делает, и что это должно быть именно так, тогда как обычный JOIN оставит вас или кого-то еще, задаваясь вопросом, что стандарт сказал о реализации и был INNER / OUTER / LEFT пропущен случайно или по назначению.
Туукка Хаапаниеми
243

Нет, разницы нет, чистый синтаксический сахар .

Quassnoi
источник
22
Я бы не назвал это синтаксическим сахаром. Тип соединения «по умолчанию», «стенография» или «псевдоним», может быть.
mk12
62
В информатике синтаксический сахар - это синтаксис в языке программирования, предназначенный для облегчения чтения или выражения . Я считаю, что способность опускать INNERподпадает под это определение.
Кассной,
14
Если вы применяете определение буквально, да, но я всегда видел его зарезервированным для более интересных типов синтаксиса, а не только для альтернативных имен вещей.
mk12
10
@Quassnoi сам факт , что этот вопрос задан, показывает absense из INNERничего не делает легче читать запрос. Насколько я знаю, это JOINвполне может означать, LEFT JOINесли это не проясняется ответами здесь.
Мартеннис
2
@Quassnoi Цитируемое вступительное утверждение вашего комментария в вики верно для синтаксического сахара, но неадекватно как определение. Синтаксический сахар - это более простой синтаксис для особых случаев сложного синтаксиса. Более уместно сказать, что INNER - это «шумовое слово».
Филипп
144

INNER JOIN = ПРИСОЕДИНИТЬСЯ

INNER JOIN используется по умолчанию, если вы не указали тип при использовании слова JOIN.

Вы также можете использовать LEFT OUTER JOIN или RIGHT OUTER JOIN, в этом случае слово OUTER является необязательным, или вы можете указать CROSS JOIN.

ИЛИ

Для внутреннего объединения синтаксис:

SELECT ...
FROM TableA
[INNER] ПРИСОЕДИНИТЬСЯ к TableB

(другими словами, ключевое слово «INNER» является необязательным - результаты одинаковы с или без)

net_prog
источник
59

Отличается ли это между различными реализациями SQL?

Да, Microsoft Access не позволяет просто join. Это требует inner 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
Я противоположность вам: я всегда говорю «INNER JOIN», но я никогда не использую OUTER; так что "LEFT JOIN" и "RIGHT JOIN". Думаю, я просто сохраняю количество своих персонажей постоянным!
Стивен Холт
10
@ Джонатан. На внутреннем соединении нет понятия направления. Внешние объединения могут давать несопоставимые наборы результатов, которые могут различаться в зависимости от направления. Внутренний требует соответствия, поэтому направление не имеет значения.
Карл Кенингер
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;

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

Мартин Смит
источник