Учу SQL и понимаю, что схема Join-ов основанная на пересекающихся кругах не корректна. Результатом джойнов всегда идет увеличение таблицы в ширь. А по схеме с кругами площадь кругов почти везде не увеличивается. И также круговая схема не показывает заполнение NULL-ами при LEFT и RIGHT джойнах. Предлагаю схему на прямоугольниках, где закрашенный красный это результирующая таблица джойнов, черный это заполнение NULL-ами. Серые прямоугольники оставлены просто для наглядности и ничего не означают.
Комментарии (26)
maslbl4
11.10.2022 14:38+4Хорошая схема есть в блоге jooq https://blog.jooq.org/say-no-to-venn-diagrams-when-explaining-joins/
ARad
11.10.2022 14:55+4Вы продолжаете тему?
https://habr.com/ru/post/448072/
https://habr.com/ru/post/450528/
ITMatika
11.10.2022 15:11+2У вас на прямоугольниках соединение один к одному.
А один ко многим? А многие ко многим?Ivan22
11.10.2022 15:15+1ну это база, на ее основе уже нарисовать другие случаи не сложно, если есть понимание. Джоин не по уникальному ключу даст дубликацию данных, соответсвенно столбец резульатат подрастет
Pavel_nobranch Автор
11.10.2022 15:17Долго думал над этими вариантами. Пока не увидел решение. Думаю картинка не сможет раскрыть эти варианты. Тут нужна какая нибудь анимация.
Pavel_nobranch Автор
11.10.2022 15:28+1Вообще на картинке прямоугольники джойнятся на плоскости по координате Y. А если добавить 3-е измерение может и получится
funca
12.10.2022 10:23+1Там под капотом ещё несколько операций Selection, Projection. Их проще изучать по-отдельности. На мой взгляд таблицы лучше всего подходят для иллюстрации. Хотя вместо конкретных значений можно попробовать цветовую раскраску как у вас, но различая для разных таблиц и колонок. А вообще Relational Algebra.
BareDreamer
11.10.2022 17:05+5Я слабо понимаю, зачем это нужно. Все эти схемы не дают понимания, что такое декартово произведение, что число строк может перемножаться. Связь в join может быть по не уникальным столбцам или там может быть какое-то другое условие кроме равенства.
Ivan22
11.10.2022 17:38+1при изучении джоинов как раз таки начинать надо не с декартова произведения, а с джоина по FK->PK. оно гораздо более и распространено и интуитивно понятно. Потом учатся различия между inner и outer - потом full, left, right. Потом джоины не по PK, потом не по эквисоединению.... и только потом cross join - как самый вырожденный случай
funca
12.10.2022 01:22У меня первой книжкой по базам была "Введение в системы баз данных" Дейта. Он сначала даёт реляционную алгебру, а потом на этой основе рассказывает про SQL. С пониманием джоинов вообще не было проблем. Cross join это вообще самое простое - тупо берём все возможные комбинации. Он не вырожденный, а наиболее общий. Вот для всех остальных частных случаев уже приходится включать воображение.
Ivan22
12.10.2022 10:38реляционную алгебру учить имеет смысл в университете. А на проекте, если я хочу подтянуть джуна в sql-е, последнее что я захочу делать - это обучать реляционной алгебре
JordanCpp
13.10.2022 00:01+1Предлагаю простую схему для понимания join' ов:)
Pavel_nobranch Автор
13.10.2022 05:47Inner join - стопка водки только с закуской
Left - закуска есть или нет все равно пьем
Right - я пока ем, а вы наливайте что есть
Full - пьем жрем все до чего дотянулся
Full exclusive - пьем жрем не закусываем
Left exclusive - кто взял закуску не пьет
Right exclusive - кому налили не жрет)
Ivan22
13.10.2022 17:08+1я бы уточнил, это CROSS - "пьем жрем все до чего дотянулся "
а FULL - если и закусываем, то только подходящими закусками под каждый алкоголь
pennanth
Серые прямоугольники - это отфильтрованные join'ами данные, которые не включены в результат. Польза от них большая.