LEFT JOIN против LEFT OUTER JOIN в SQL Server

1595

В чем разница между LEFT JOINи LEFT OUTER JOIN?

КГ Соса
источник
213
Никто! OUTERНеобязательное ключевое слово.
Джарл
9
Диаграммы Венна не подходят для ответов на этот вопрос. Ответ на этот вопрос - Нет . Смотрите первый комментарий.
Philipxy
3
Венны диаграммы иллюстрируют разницу в выходных строках для особых случаев по внутреннему против внешнего соединения . Если никакие пустые или повторяющиеся строки не вводятся (поэтому мы можем считать таблицу набором значений со значениями строк и использовать нормальное математическое равенство), то в левом и правом кружках содержатся выходные таблицы / наборы левого и правого соединения . Но если вводятся нулевые или повторяющиеся строки, то так сложно объяснить, что представляют собой наборы окружностей и как эти наборы связаны с таблицами / пакетами ввода и вывода, что диаграммы Венна бесполезны. Смотрите мои комментарии здесь о других злоупотреблениях диаграммой Венна.
Philipxy

Ответы:

2237

Согласно документации: ОТ (Transact-SQL) :

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

Ключевое слово OUTERпомечается как необязательное (заключено в квадратные скобки). В этом конкретном случае, независимо от того, указали вы это OUTERили нет, не имеет значения. Обратите внимание, что, хотя другие элементы предложения join также помечены как необязательные, их исключение будет иметь значение.

Например, вся типовая часть 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

Также взгляните на ответ, который я оставил на этот другой SO вопрос: SQL оставил соединение против нескольких таблиц в строке ОТ? ,

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

Лассе В. Карлсен
источник
135
Абсолютно правильно. OUTER разрешен для совместимости с ANSI-92.
Шон Рейли
11
@ LasseV.Karlsen было бы лучше иметь INNER JOINсправа и JOINслева в списке эквивалентов?
Nawfal
8
@ LasseV.Karlsen Я просто имел в виду, что левая сторона имеет сжатую форму, а правая сторона имеет расширенную форму. Я думал, что было бы логично, если бы вы следовали тому же для JOINs.
Nawfal
30
@Outlier Это ваша прерогатива, но, очевидно, 451 человек сочли ответ хорошим. Если честно, если в одном ответе написано «X», а в другом ответе - «X» и содержится ссылка на документацию, а также на копирование соответствующих частей документации в ответ, мой голос переходит ко второму ответу, и поэтому я пишу свои ответы так, как нужно. Я делаю. То, что кто-то утверждает, что Х - это не хорошо. Если вы можете доказать X, это лучше (не для небольшого ответа). Но это ваша прерогатива думать, что вы хотите. Я спрашиваю, почему вы думаете, что это бессмысленно, так или иначе, ответ неверен?
Лассе В. Карлсен
7
@Outlier И если честно, если вам не хочется читать мои «длинные» ответы, тогда мой ответ был не для вас. Это для всех остальных, кто интересуется тем же и хочет узнать, почему это так, и где найти дополнительную информацию и т. Д. Очевидно, что вы из тех парней, которые хотели бы получить такой ответ: «Нет», но, к сожалению, это не является юридическим ответом здесь, на переполнении стека, и не должно быть.
Лассе В. Карлсен
700

Чтобы ответить на ваш вопрос, нет разницы между LEFT JOIN и LEFT OUTER JOIN, они точно такие же , как сказали ...

На верхнем уровне в основном 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

sactiw
источник
17
Очень хороший ответ Будет понятнее, если вы скажете «LEFT OUTER JOIN - извлекает все данные из левой таблицы с соответствующими данными справа, если они заданы». для 2.1 (и аналогичные изменения для 2.2)
ssh
1
Также вы можете сделать кросс-соединение, просто «выбрав * из таблицы А, таблицы В»
om471987
3
Извините, если я necrobumping, но это так CROSS JOINже, как FULL JOIN?
TechnicalTophat
9
@RhysO no, CROSS JOIN - это декартово произведение, т. Е. CROSS JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, всегда будет давать (n * m) строк, тогда как FULL OUTER JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, даст максимум (n + m) строк
sactiw 13.07.16
1
@sactiw подумайте над тем, чтобы добавить в свой ценный ответ специальную заметку о разнице между Cross Joinи Full Outer Join... в некотором роде кажется похожим.
Мануэль Джордан
356

В чем разница между левым соединением и левым внешним соединением?

Ничего . LEFT JOINи LEFT OUTER JOINэквивалентны.

Митч Пшеничный
источник
13
эм привет! кто проголосовал за это? LEFT JOIN - это то же самое, что LEFT OUTER JOIN.
Митч Уит
7
Это имеет место в Microsoft SQL Server и любой другой SQL-совместимой СУБД.
Билл Карвин
7
Было бы неплохо, если бы вы добавили ссылку или объяснение того, почему OUTERэто необязательно.
Ноль3
7
Самый краткий, точный ответ здесь.
Манахи
4
Спасибо. В принятом ответе было слишком много информации, которая оставила меня в замешательстве. Это именно то, что мне нужно было знать, и я сразу отвечаю на исходный вопрос.
Бекон Брэд
66

Я - администратор PostgreSQL, насколько я понимаю, разница между внешними или не внешними соединениями - это тема, которая широко обсуждается в Интернете. До сегодняшнего дня я никогда не видел разницы между этими двумя; Поэтому я пошел дальше, и я пытаюсь найти разницу между ними. В конце я прочитал всю документацию об этом, и я нашел ответ для этого,

Так что, если вы посмотрите на документацию (по крайней мере, в PostgreSQL), вы можете найти эту фразу:

«Слова INNERи не OUTERявляются обязательными во всех формах. INNERЯвляется по умолчанию, LEFT, RIGHTи FULLподразумевает внешнее соединение.»

Другими словами,

LEFT JOINи те LEFT OUTER JOINже

RIGHT JOINи те RIGHT OUTER JOINже

Я надеюсь, что это может помочь тем, кто все еще пытается найти ответ.

andrefsp
источник
61

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

Данный

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

Левое соединение и левое внешнее соединение

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

Результаты

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


Правое соединение и правое внешнее соединение

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

Результаты

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

WorkSmarter
источник
43

Мне кажется, что в Joins проще думать в следующем порядке:

  • CROSS JOIN - декартово произведение обеих таблиц. ВСЕ объединения начинаются здесь
  • INNER JOIN - CROSS JOIN с добавленным фильтром.
  • ВНЕШНЕЕ СОЕДИНЕНИЕ - ВНУТРЕННЕЕ СОЕДИНЕНИЕ с отсутствующими элементами (из таблицы ВЛЕВО или ВПРАВО), добавленными впоследствии.

Пока я не разобрался в этой (относительно) простой модели, JOINS всегда были чем-то вроде черного искусства. Теперь они имеют смысл.

Надеюсь, это поможет больше, чем смущает.

frozenjim
источник
Это не отвечает на вопрос.
Филипп
33

Почему ВЛЕВО / ВПРАВО и ВЛЕВО НАРУЖНО / ВПРАВО наружу одинаковы? Давайте объясним, почему этот словарь. Поймите, что соединения LEFT и RIGHT являются особыми случаями соединения OUTER, и поэтому не могут быть ничем иным, как OUTER LEFT / OUTER RIGHT. Соединение OUTER также называется FULL OUTER, в отличие от соединений LEFT и RIGHT, которые являются ЧАСТИЧНЫМИ результатами соединения OUTER. Верно:

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 случая: INNER, OUTER, CROSS. С двумя кейсами для ВНЕШНЕГО. Словарный запас, то, как учителя объясняют это, а также некоторые ответы выше, часто создают впечатление, что существует множество различных типов объединения. Но на самом деле все очень просто.

Юго Амарил
источник
1
«Ясно, что существуют только 3 случая»: интересно, но ошибочно. Учтите, что внутреннее соединение - это специализированное перекрестное соединение (т. Е. Предикаты перемещения join к предложению where). Кроме того, учтите, что внешнее объединение вообще не является объединением, а представляет собой объединение, в котором вместо «пропущенных» столбцов используются пустые значения. Следовательно, можно утверждать, что кросс является единственным необходимым соединением. Обратите внимание, что современное мышление в теории отношений заключается в том, что естественное соединение удовлетворяет всем требованиям соединения. Помимо этого: можете ли вы объяснить, соответствует ли словарь JOINсловосочетанию INNER JOIN«внешний вид соединения» внешнему соединению?
понедельник,
27

Ответить на ваш вопрос

В Sql Server присоединяется синтаксис OUTER необязательно

Упоминается в статье MSDN: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Таким образом, следующий список показывает эквивалентные синтаксисы соединения с и без OUTER

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

Другие эквивалентные синтаксисы

INNER JOIN => JOIN
CROSS JOIN => ,

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

масса
источник
2
По поводу злоупотребления диаграммами Венна см. Мой комментарий к вопросу.
Филипп
20

Есть только 3 соединения:

  • A) Перекрестное соединение = декартово (например, таблица A, таблица B)
  • B) Внутреннее соединение = JOIN (например, таблица A Join / Inner Join Table B)
  • В) Наружное соединение:

       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    

Надеюсь, это поможет.

Delickate
источник
1
Таким образом, 5 объединений в целом.
Zeek2
19

Есть в основном три типа JOIN

  1. Внутренний: извлекает данные, которые присутствуют в обеих таблицах
    • Only JOIN означает ВНУТРЕННЕЕ СОЕДИНЕНИЕ
  2. Наружный: бывают трех типов

    • LEFT OUTER - извлекает данные, присутствующие только в левой таблице, и соответствует условию
    • RIGHT OUTER - извлекает данные, присутствующие только в правой таблице и в состоянии соответствия
    • FULL OUTER - извлекает данные из любой или обеих таблиц
    • (ВЛЕВО или ВПРАВО или ПОЛНО) ВНЕШНЕЕ СОЕДИНЕНИЕ можно записать без записи «ВНЕШНИЙ»
  3. Cross Join: объединяет все со всем

жесткий
источник
16

Синтаксический сахар делает для обычного читателя более очевидным, что соединение не является внутренним.

Unsliced
источник
2
Итак ... что тогда ПОЛНОЕ НАРУШНОЕ СОЕДИНЕНИЕ?
Эми Б
5
tableA FULL OUTER JOIN tableB предоставит вам три типа записей: все записи в tableA без соответствующей записи в tableB, все записи в tableB без соответствующей записи в tableA и все записи в tableA с соответствующей записью в tableB.
Дэйв ДюПлантис
4

Именно в контексте этого вопроса я хочу также опубликовать 2 оператора 'APPLY':

СОЕДИНЯЕТСЯ :

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

  2. НАРУЖНОЕ СОЕДИНЕНИЕ

    • LEFT OUTER JOIN = ЛЕВОЕ СОЕДИНЕНИЕ

    • RIGHT OUTER JOIN = ПРАВИЛЬНОЕ СОЕДИНЕНИЕ

    • FULL OUTER JOIN = ПОЛНОЕ СОЕДИНЕНИЕ

  3. CROSS JOIN

САМОСОЕДИНЕНИЕ : Это не совсем отдельный тип соединения. Это в основном соединение таблицы с самим собой с помощью одного из вышеуказанных соединений. Но я чувствовал, что стоит упомянуть в контексте обсуждения JOIN, поскольку вы услышите этот термин от многих в сообществе разработчиков SQL.

ПРИМЕНИТЬ :

  1. CROSS APPLY - аналогично INNER JOIN (но добавлено преимущество возможности вычислять что-то в правой таблице для каждой строки левой таблицы и возвращать только совпадающие строки)
  2. OUTER APPLY - аналогично LEFT OUTER JOIN (но добавило преимущество возможности вычислять что-то в правой таблице для каждой строки левой таблицы и возвращать все строки из левой таблицы независимо от совпадения в правой таблице)

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 очень полезным, поскольку он дает лучшую производительность, чем выполнение тех же вычислений в подзапросе. Они также являются заменой многих аналитических функций в более старых версиях SQL Server. Вот почему я считаю, что после того, как освоиться с JOINS, один из разработчиков SQL должен попытаться изучить операторы APPLY.

Сан -
источник