12 Вопрос: LEFT JOIN против LEFT OUTER JOIN в SQL Server

вопрос создан в Tue, Aug 23, 2016 12:00 AM

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

    
1443
  1. Нет! Ключевое слово OUTER является необязательным.
    2016-06-02 14: 02: 11Z
  2. Диаграммы Венна не подходят для ответов на этот вопрос. Ответ на этот вопрос Нет . Смотрите первый комментарий.
    2019-05-05 08: 00: 05Z
  3. Диаграммы Венна иллюстрируют разницу в выходных строках для особых случаев внутреннего и внешнего соединения я>. Если на входе нет нулевых или повторяющихся строк (поэтому мы можем взять таблицу как набор значений со значениями строк и использовать нормальное математическое равенство) , то left & правые кружки содержат выходные таблицы /наборы левых & Право присоединиться . Но если вводятся нулевые или повторяющиеся строки, то так сложно объяснить, что такое круги - это наборы & как эти наборы связаны с вводом & выводить таблицы /пакеты, которые диаграммы Венна не помогают. Смотрите мои комментарии здесь о других злоупотреблениях диаграммой Венна.
    2019-05-05 08: 14: 02Z
12 ответов                              12                         

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

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

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

Например, вся типовая часть предложения 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-соединение слева против нескольких таблиц в строке FROM? а>. р>

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

    

2075
2017-05-23 10: 31: 37Z
  1. Абсолютно правильно. OUTER разрешен для совместимости с ANSI-92.
    2009-01-02 21: 34: 01Z
  2. @ LasseV.Karlsen было бы лучше иметь INNER JOIN справа и просто JOIN слева в списке эквивалентов?
    2013-05-01 14: 55: 03Z
  3. @ LasseV.Karlsen Я просто имел в виду, что левая сторона имеет краткую форму, а правая сторона имеет расширенную форму. Я думал, что это будет согласованно, если вы последуете за тем же JOINs.
    2013-05-02 07: 40: 10Z
  4. @ Outlier Это ваша прерогатива, но, очевидно, 451 человек сочли ответ хорошим. Если честно, если в одном ответе написано «X», а в другом ответе - «X» и содержится ссылка на документацию, а также на копирование соответствующих частей документации в ответ, мой голос переходит ко второму ответу, и поэтому я пишу свои ответы так, как нужно. Я делаю. То, что кто-то утверждает, X не хорошо. Если вы можете доказать X, это лучше (не в ответ на небольшой вопрос). Но это ваша прерогатива думать, что вы хотите. Я спрашиваю, почему тыНК, хотя это бессмысленно, ответ неверен в любом случае?
    2014-07-20 19: 21: 10Z
  5. @ Outlier И, честно говоря, если вам не хочется читать мои "длинные" ответы, тогда мой ответ был не для вас. Это для всех остальных, кто интересуется тем же и хочет узнать, почему это так, и где найти дополнительную информацию и т. Д. Очевидно, что вы из тех парней, которые хотели бы получить такой ответ: «Нет», но, к сожалению, это здесь нет юридического ответа о переполнении стека, и не должно быть.
    2014-07-20 19: 25: 27Z
  

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

672
2014-05-14 09: 38: 02Z
  1. Очень хороший ответ. Будет понятнее, если вы скажете «LEFT OUTER JOIN - извлекает все данные из левой таблицы с соответствующими данными справа, если они заданы». для 2.1 (и аналогичные изменения для 2.2)
    2012-12-27 19: 27: 00Z
  2. Также вы можете сделать перекрестное объединение, просто 'select * from TableA, TableB'
    2013-02-10 18: 22: 25Z
  3. Извините, если я выполняю некробампинг, но CROSS JOIN такой же, как FULL JOIN?
    2016-07-13 13: 11: 14Z
  4. @ RhysO no, CROSS JOIN - декартово произведение, т. е. CROSS JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, всегда будет давать (n * m) строки, в то время как FULL OUTER JOIN таблицы, имеющей n строк, с таблицей, имеющей m строк, даст максимум (n + m) строк
    2016-07-13 15: 34: 50Z
  

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

Nothing . LEFT JOIN и LEFT OUTER JOIN эквивалентны.

    
332
2014-08-22 00: 03: 40Z
  1. erm hello! кто проголосовал за этосвоя? LEFT JOIN - это то же самое, что LEFT OUTER JOIN.
    2009-01-02 08: 35: 38Z
  2. Это относится к Microsoft SQL Server и любым другим SQL-совместимым СУБД.
    2009-01-02 08: 41: 19Z
  3. Было бы неплохо, если бы вы добавили ссылку или пояснение о том, почему OUTER является необязательным.
    2016-04-12 12: 50: 00Z
  4. Самый краткий и точный ответ здесь.
    2017-09-26 01: 15: 41Z
  5. Спасибо. В принятом ответе было слишком много информации, которая оставила меня в замешательстве. Это именно то, что мне нужно было знать, и я сразу отвечаю на исходный вопрос.
    2018-08-09 20: 36: 40Z

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

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

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

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

LEFT JOIN и LEFT OUTER JOIN одинаковы

RIGHT JOIN и RIGHT OUTER JOIN одинаковы

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

    
62
2015-05-23 03: 42: 32Z

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

Учитывая

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

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

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

Результаты

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

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

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

Результаты

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

    
55
2017-12-14 23: 06: 26Z

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

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

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

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

    
38
2011-12-29 21: 01: 36Z
  1. Это не отвечает на вопрос.
    2019-06-17 03: 38: 01Z

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

    
28
2014-04-17 21: 15: 11Z
  1. "ясно, что существует только 3 случая": интересно, но с недостатками. Учтите, что внутреннее соединение - это специализированное перекрестное соединение (т. Е. Предикаты перемещения в предложении where). Кроме того, учтите, что внешнее объединение вообще не является объединением, а представляет собой объединение, в котором вместо пустых столбцов используются пустые значения. Следовательно, можно утверждать, что кросс является единственным необходимым соединением. Обратите внимание, что современное мышление в теории отношений заключается в том, что естественное соединение удовлетворяет всем требованиям соединения. Помимо этого: можете ли вы объяснить, соответствует ли /как словарь «JOIN INNER JOIN» вашему рассуждению о внешнем словарном соединении?
    2016-07-06 10: 39: 44Z

Чтобы ответить на ваш вопрос

  

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

    
21
2019-01-17 09: 16: 53Z
  1. Повторное злоупотребление диаграммами Венна см. в моем комментарии по этому вопросу.
    2019-04-29 01: 52: 40Z

Существует в основном три типа JOIN

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

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

18
2012-01-18 12: 59: 50Z
Дел>

Всего 3 соединения:

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

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

    
18
2017-03-17 09: 56: 33Z
  1. Таким образом, всего 5 соединений.
    2018-07-20 10: 44: 27Z

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

    
14
2012-08-10 20: 28: 11Z
  1. Итак ... что же тогда FULL OUTER JOIN?
    2009-01-02 20: 29: 16Z
  2. tableA FULL OUTER JOIN tableB предоставит вам три типа записей: все записи в tableA без соответствующей записи в tableB, все записи в tableB без соответствующей записи в tableA, и все записи в таблице A с соответствующей записью в таблице B.
    2009-10-05 18: 16: 18Z

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

JOINS

  1. INNER JOIN = JOIN

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

    • LEFT OUTER JOIN = LEFT JOIN

    • RIGHT OUTER JOIN = RIGHT JOIN

    • FULL OUTER JOIN = FULL JOIN

  3. CROSS JOIN

SELF-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 /наружный применяются в-SQL-сервер / р>

Пример из реальной жизни, когда следует использовать ВНЕШНЕЕ /КРЕСТНОЕ ПРИМЕНЕНИЕ в SQL

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

    
0
2019-06-17 02: 23: 09Z
источник размещен Вот