#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.