Разве SQL не является левым соединением B, просто A?

#sql

Вопрос:

Поэтому я посмотрел несколько графиков, чтобы понять разницу между соединениями, и наткнулся на это изображение:

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

Возможно, проблема в том, чтобы представить это с помощью диаграмм Венна. Но, глядя на первое соединение, вверху слева, разве это не просто А? Какая разница, что там делает B?

РЕДАКТИРОВАТЬ: https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/

Этот веб-сайт хорошо объясняет это

Комментарии:

1. Нет, это А и часть В, как и следует из диаграммы.

2. Этот набор диаграмм Венна немного вводит в заблуждение при описании соединений SQL. Это не показывает, как строки в A могут дублироваться при наличии нескольких совпадений по условию соединения в B.

3. @digital.aaron точно, как можно превратить sql-соединения в математическую диаграмму Венна в качестве объяснения. Это, безусловно, вводит в заблуждение, потому что не требуется всех примеров, чтобы охватить все его альтернативы. Возможно, выглядит как ярлык документа для очистки интервью на тему, называемую базовыми соединениями sql

4. @HimanshuAhuja Я бы, наверное, предпочел описать их примерно так: blog.jooq.org/2016/07/05/…

5. Существует способ, которым внешние соединения по сравнению с внутренними соединениями иллюстрируются диаграммами Венна, но эта диаграмма неверна обычным способом, и я объясняю это в комментариях по вашей ссылке. Прочитайте учебник или руководство о том, как работает левое соединение, интернет-это мусор. Этот вопрос является очевидным дубликатом. Смотрите мой ответ и множество комментариев по дублирующей ссылке.

Ответ №1:

Нет, поскольку это соединение, оно может создавать мощности, превышающие 1 для строк в A. То есть, если есть несколько совпадающих строк из B, то строка в A будет отображаться несколько раз.

Пример:

Таблица А:

 id name
-- -------
 1 Alice
 2 Malcolm
 3 Kelly
 

Таблица В:

 id_a preferred_food
---- --------------
   1 Pizza
   2 Burger
   2 Steak
   2 Menestroni
 

Тогда «A слева присоединится к B» даст вам:

 id name    id_a preferred_food
-- ------- ---- --------------
 1 Alice      1 Pizza
 2 Malcolm    2 Burger
 2 Malcolm    2 Steak
 2 Malcolm    2 Menestroni
 3 Kelly   null null
 

Короче говоря:

  • Все строки из A отображаются в левом соединении: даже 3 Kelly отображаются.
  • Столбцы из B будут отображаться с нулевыми значениями, если в B нет совпадающих строк: строка 3 Kelly есть null в последних двух столбцах.
  • Строки в A могут отображаться несколько раз, если у них несколько совпадений в B: строка 2 Malcolm отображается три раза.

Ответ №2:

Ваша диаграмма не совсем диаграмма Венна.

Пересечение двух кругов представляет соединенные строки (в соответствии с вашим условием соединения) с данными как из таблицы A, так и из таблицы B.

Левый полумесяц (помеченный «A») представляет строки в таблице A, которым не соответствуют строки в таблице B; правый полумесяц (помеченный «B») представляет строки в таблице B, которым не соответствуют строки в таблице A.

Что должна показать верхняя левая диаграмма, так это то, что левое соединение дает вам данные как из таблицы A, так и из таблицы B, которые могут быть объединены в соответствии с вашим условием соединения, плюс все строки из таблицы A, которые не имеют соответствующего соответствия в таблице B.

Комментарии:

1. Диаграмма является диаграммой Венна, если мы примем окружности A и B за строки левого соединения B и правого соединения B соответственно. Но схема плохая. Смотрите мой комментарий к вопросу, а также комментарии и ответы, которые в нем упоминаются.

Ответ №3:

При объединении вы получаете поля из обеих таблиц, а не только из A. Это также умножает количество возвращаемых записей, если связь между таблицами не равна 1-1.

По сути, единственное различие между всеми этими СОЕДИНЕНИЯМИ заключается в поведении, когда записи в A не совпадают ни с какими записями в B, и наоборот. Ваши диаграммы показывают только такое поведение.

Диаграмма вверху позволяет = сохранить все записи из A, независимо от того, соответствуют ли они чему-либо в B ( что не представлено: когда они совпадают, получите данные из B).

Ответ №4:

ЛЕВОЕ СОЕДИНЕНИЕ B ОЗНАЧАЕТ A (общие ЗАПИСИ A, КОТОРЫЕ ЕСТЬ В B) левое соединение предпочтительнее выполнять там, где в таблице, к которой присоединено больше записей, в данном случае A, и эти записи могут ссылаться на некоторые другие столбцы из B при некоторых общих условиях. следовательно, результат A, оставляющий соединение B, будет означать не только A, но и добавленные столбцы B в случае, если потребуется, для некоторого общего значения A и B.

Ответ №5:

На этой диаграмме они опускают слово «внешний» из этого описания, но вы должны прочитать его как LEFT OUTER JOIN .

В таблице «слева» от инструкции SQL (которая будет таблицей после FROM, и в данном случае таблицей A) будет возвращена каждая строка независимо от того, есть ли в таблице B соответствующая строка, соответствующая условию СОЕДИНЕНИЯ.

В этом разница между внутренним соединением и внешним соединением. Внутренние соединения возвращают только строку, в которой есть соответствие условию соединения, в то время как ЛЕВОЕ ВНЕШНЕЕ соединение возвращает те же строки, возвращенные ВНУТРЕННИМ соединением, а также СТРОКУ для любых строк в ЛЕВОЙ таблице, которые не удовлетворяют условию СОЕДИНЕНИЯ. Для тех строк в ЛЕВОЙ таблице, которые не присоединяются к одной или нескольким строкам таблицы B, столбцы таблицы B, которые могут быть указаны в ВЫБОРЕ, будут равны НУЛЮ.

Вы можете видеть, что это свойство несопоставимых ЛЕВЫХ строк, имеющих нулевые значения для столбцов таблицы B, используется в приведенном ниже примере непосредственно для фильтрации любых строк, полученных в результате успешного соединения с таблицей B.