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

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

2.01.2009 08:30:10
Никто! OUTERНеобязательное ключевое слово.
jarlh 2.06.2016 14:02:11
Диаграммы Венна не подходят для ответов на этот вопрос. Ответ на этот вопрос - Нет . Смотрите первый комментарий.
philipxy 5.05.2019 08:00:05
Венны диаграммы иллюстрируют разницу в выходных строках для особых случаев по внутреннему против внешнего соединения . Если никакие пустые или повторяющиеся строки не вводятся (поэтому мы можем считать таблицу набором значений со значениями строк и использовать нормальное математическое равенство), то в левом и правом кружках содержатся выходные таблицы / наборы левого и правого соединения . Но если вводятся нулевые или повторяющиеся строки, то так сложно объяснить, что представляют собой наборы окружностей и как эти наборы связаны с таблицами / пакетами ввода и вывода, что диаграммы Венна бесполезны. Смотрите мои комментарии здесь о других злоупотреблениях диаграммой Венна.
philipxy 5.05.2019 08:14:02
12 ОТВЕТОВ
РЕШЕНИЕ

Согласно документации: ОТ (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 оставил соединение против нескольких таблиц в строке ОТ? ,

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

2216
24.07.2019 08:23:07
Абсолютно правильно. OUTER разрешен для совместимости с ANSI-92.
Sean Reilly 2.01.2009 21:34:01
@ LasseV.Karlsen было бы лучше иметь INNER JOINсправа и JOINслева в списке эквивалентов?
nawfal 1.05.2013 14:55:03
@ LasseV.Karlsen Я просто имел в виду, что левая сторона имеет сжатую форму, а правая сторона имеет расширенную форму. Я думал, что это будет согласованно, если вы будете следовать за тем же для JOINs.
nawfal 2.05.2013 07:40:10
@Outlier Это ваша прерогатива, но, очевидно, 451 человек сочли ответ хорошим. Если честно, если в одном ответе написано «X», а в другом ответе - «X» и содержится ссылка на документацию, а также на копирование соответствующих частей документации в ответ, мой голос переходит ко второму ответу, и поэтому я пишу свои ответы так, как нужно. Я делаю. То, что кто-то утверждает, что Х - это не хорошо. Если вы можете доказать X, это лучше (не в ответ на небольшой вопрос). Но это ваша прерогатива думать, что вы хотите. Я спрашиваю, почему вы думаете, что это бессмысленно, так или иначе, неправильный ответ?
Lasse V. Karlsen 20.07.2014 19:21:10
@Outlier И если честно, если вам не хочется читать мои «длинные» ответы, тогда мой ответ был не для вас. Это для всех, кто приезжает сюда, интересуясь тем же, и хочет узнать, почему это так, и где найти дополнительную информацию и т. Д. Очевидно, вы из тех парней, которые хотели бы получить такой ответ: «Нет», но, к сожалению, это не является юридическим ответом здесь, на переполнении стека, и не должно быть.
Lasse V. Karlsen 20.07.2014 19:25:27

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

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

351
22.08.2014 00:03:40
эм привет! кто проголосовал за это? LEFT JOIN - это то же самое, что LEFT OUTER JOIN.
Mitch Wheat 2.01.2009 08:35:38
Это имеет место в Microsoft SQL Server и любой другой SQL-совместимой СУБД.
Bill Karwin 2.01.2009 08:41:19
Было бы неплохо, если бы вы добавили ссылку или объяснение того, почему OUTERэто необязательно.
Zero3 12.04.2016 12:50:00
Самый краткий, точный ответ здесь.
Manachi 26.09.2017 01:15:41
Спасибо. В принятом ответе было слишком много информации, которая оставила меня в замешательстве. Это именно то, что мне нужно было знать, и я сразу отвечаю на исходный вопрос.
Bacon Brad 9.08.2018 20:36:40

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

15
10.08.2012 20:28:11
Итак ... что тогда ПОЛНОЕ НАРУШНОЕ СОЕДИНЕНИЕ?
Amy B 2.01.2009 20:29:16
tableA FULL OUTER JOIN tableB предоставит вам три типа записей: все записи в tableA без соответствующей записи в tableB, все записи в tableB без соответствующей записи в tableA и все записи в tableA с соответствующей записью в tableB.
Dave DuPlantis 5.10.2009 18:16:18

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

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

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

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

LEFT JOINи те LEFT OUTER JOINже

RIGHT JOINи те RIGHT OUTER JOINже

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

65
23.05.2015 03:42:32

Чтобы ответить на ваш вопрос, нет разницы между 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

697
14.05.2014 09:38:02
Очень хороший ответ Будет понятнее, если вы скажете «LEFT OUTER JOIN - извлекает все данные из левой таблицы с соответствующими данными справа, если они заданы». для 2.1 (и аналогичные изменения для 2.2)
ssh 27.12.2012 19:27:00
Также вы можете сделать кросс-соединение, просто «выбрав * из таблицы А, таблицы В»
om471987 10.02.2013 18:22:25
Извините, если я necrobumping, но это так CROSS JOINже, как FULL JOIN?
TechnicalTophat 13.07.2016 13:11:14
@RhysO no, CROSS JOIN - это декартово произведение, т.е. CROSS JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, всегда будет давать (n * m) строк, в то время как FULL OUTER JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, даст максимум (n + m) строк
sactiw 13.07.2016 15:34:50
@sactiw рассмотреть , чтобы добавить специальную ноту в ваш ценный ответ на вопрос о разнице между Cross Joinи Full Outer Join... в какой - то способ , кажется , похожи.
Manuel Jordan 12.10.2019 14:51:17

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

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

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

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

42
29.12.2011 21:01:36
Это не отвечает на вопрос.
philipxy 17.06.2019 03:38:01

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

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

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

18
18.01.2012 12:59:50

Почему ВЛЕВО / ВПРАВО и ВЛЕВО НАРУЖНО / ВПРАВО наружу одинаковы? Давайте объясним, почему этот словарь. Поймите, что соединения 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. С двумя кейсами для ВНЕШНЕГО. Словарный запас, то, как учителя объясняют это, а также некоторые ответы выше, часто создают впечатление, что существует множество различных типов объединения. Но на самом деле все очень просто.

32
17.04.2014 21:15:11
«Ясно, что существуют только 3 случая»: интересно, но ошибочно. Учтите, что внутреннее соединение - это специализированное перекрестное соединение (т. Е. Предикаты перемещения join к предложению where). Далее, учтите, что внешнее объединение вовсе не является объединением, а скорее объединением, в котором вместо «пропущенных» столбцов используются пустые значения. Следовательно, можно утверждать, что кросс является единственным необходимым соединением. Обратите внимание, что современное мышление в теории отношений заключается в том, что естественное соединение удовлетворяет всем требованиям соединения. Помимо этого: можете ли вы объяснить, соответствует ли словарь JOINсловосочетанию INNER JOIN«внешний вид» внешнему соединению?
onedaywhen 6.07.2016 10:39:44

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

Данный

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

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

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

Результаты

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


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

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

Результаты

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

59
14.12.2017 23:06:26

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

В 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 введите описание изображения здесь

26
17.01.2019 09:16:53
По поводу злоупотребления диаграммами Венна см. Мой комментарий к вопросу.
philipxy 29.04.2019 01:52:40

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

  • A) Перекрестное соединение = декартово (например, таблица A, таблица B)
  • B) Внутреннее объединение = JOIN (например, таблица A Соединение / внутреннее объединение 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    

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

19
17.03.2017 09:56:33
Таким образом, 5 объединений в целом.
Zeek2 20.07.2018 10:44:27

Именно в контексте этого вопроса я хочу также опубликовать 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.

3
17.06.2019 02:23:09